Самый чистый способ найти соответствие в списке

После того, как вы вернулись с камеры, вам нужно stopPreview() и release(), чтобы другое приложение могло получить к нему доступ. Сделайте класс «Камера» статичным и назовите его как null в onPause(). Это разрешает мою проблему.

Попробуйте:

 public class CameraPhotoCapture extends Activity{
    static Camera mcamera = null;
    @Override
    protected void onPause() {
        // TODO Auto-generated method stub
        if (mcamera != null) {
            mcamera.stopPreview();
            mcamera.release();
            mcamera = null;
            Log.d(DEBUG_TAG, "releaseCamera -- done");
        }
        super.onPause();
    }

    @Override
    protected void onResume() {
        // TODO Auto-generated method stub
        if (mcamera != null) {

            Camera.open();
            Log.d(DEBUG_TAG, "openCamera -- done");
        }
        super.onResume();
    }
}
9
задан Oli 24 September 2008 в 14:44
поделиться

4 ответа

Konrad: Таким образом, как Вы используете его? Скажем, я хочу соответствовать mo. Идентификатор к magicNumber.

В C# 2.0 Вы записали бы:

result = mObjList.Find(delegate(int x) { return x.ID == magicNumber; });

3.0 знает лямбды:

result = mObjList.Find(x => x.ID == magicNumber);
15
ответ дан 4 December 2019 в 10:06
поделиться

Использование Лямбда-выражения:

List<MyObject> list = new List<MyObject>();

// populate the list with objects..

return list.Find(o => o.Id == myCriteria);
4
ответ дан 4 December 2019 в 10:06
поделиться

Поместите код в метод, и Вы сохраняете временный файл и a break (и Вы перерабатываете код, в качестве награды):

T Find<T>(IEnumerable<T> items, Predicate<T> p) {
    foreach (T item in items)
        if (p(item))
            return item;

    return null;
}

…, но конечно этот метод уже существует так или иначе для Списков, даже в.NET 2.0.

1
ответ дан 4 December 2019 в 10:06
поделиться

Очевидно хит производительности анонимных делегатов является довольно значительным.

Тестовый код:

    static void Main(string[] args)
    {
        for (int kk = 0; kk < 10; kk++)
        {
            List<int> tmp = new List<int>();
            for (int i = 0; i < 100; i++)
                tmp.Add(i);
            int sum = 0;
            long start = DateTime.Now.Ticks;
            for (int i = 0; i < 1000000; i++)
                sum += tmp.Find(delegate(int x) { return x == 3; });
            Console.WriteLine("Anonymous delegates: " + (DateTime.Now.Ticks - start));


            start = DateTime.Now.Ticks;
            sum = 0;
            for (int i = 0; i < 1000000; i++)
            {
                int match = 0;
                for (int j = 0; j < tmp.Count; j++)
                {
                    if (tmp[j] == 3)
                    {
                        match = tmp[j];
                        break;
                    }
                }
                sum += match;
            }
            Console.WriteLine("Classic C++ Style: " + (DateTime.Now.Ticks - start));
            Console.WriteLine();
        }
    }

Результаты:

Anonymous delegates: 710000
Classic C++ Style: 340000

Anonymous delegates: 630000
Classic C++ Style: 320000

Anonymous delegates: 630000
Classic C++ Style: 330000

Anonymous delegates: 630000
Classic C++ Style: 320000

Anonymous delegates: 610000
Classic C++ Style: 340000

Anonymous delegates: 630000
Classic C++ Style: 330000

Anonymous delegates: 650000
Classic C++ Style: 330000

Anonymous delegates: 620000
Classic C++ Style: 330000

Anonymous delegates: 620000
Classic C++ Style: 340000

Anonymous delegates: 620000
Classic C++ Style: 400000

В каждом случае использование анонимных делегатов приблизительно на 100% медленнее, чем другой путь.

1
ответ дан 4 December 2019 в 10:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: