Проверка на наличие объекта в коллекции (T) - PullRequest
1 голос
/ 30 декабря 2008

Я вижу, что по этому вопросу LINQy способ проверить, имеют ли какие-либо объекты в коллекции одинаковое значение свойства , есть запрос, чтобы сказать, как сделать что-то, используя LINQ, чтобы увидеть, соответствует ли свойство Коллекция. Тем не менее, это самый быстрый разумный процесс, чтобы сделать это? Я буду развертывать что-то, что требует определенного уровня управления ресурсами, и я хочу, чтобы приложение было настолько отзывчивым, насколько это возможно, не делая код ужасно трудным для расшифровки, когда кто-то другой или я сам вернусь к нему позже.

Ответы [ 4 ]

2 голосов
/ 30 декабря 2008

Однако, это самый быстрый и разумный процесс для этого?

Я бы предположил, что быстрый (возможно, самый быстрый) способ сделать это - добавить все объекты в Dictionary или HashSet, используя свойство в качестве ключевого поля: такой метод, как HashSet. код возврата, который сообщает вам, было ли добавлено значение этого свойства. Например:

static bool containsDuplicate(Container<Foo> fooCollection)
{
    //create the hash set
    HashSet<Bar> hashSet = new HashSet<Bar>();
    //for each object to be tested
    foreach (Foo foo in fooCollection)
    {
        //get the interesting object property
        Bar propertyValue = fooCollection.bar;
        //see whather we've already seen this property value
        if (!hashSet.Add(propertyValue))
        {
            //duplicate detected
            return true;
        }
    }
    //no duplicate detected
    return false;
}
1 голос
/ 30 декабря 2008

LINQ почти никогда не является самым быстрым способом (с точки зрения необработанного времени выполнения) что-либо сделать.

Это обычно "достаточно быстро", хотя. Когда у вас есть работающее приложение с модульными тестами, вы можете профилировать его, чтобы увидеть, нужно ли оптимизировать.

«Мы должны забыть о малой эффективности, скажем, в 97% случаев: преждевременная оптимизация - корень всего зла». -Дональд Кнут

0 голосов
/ 30 декабря 2008

Это действительно зависит от количества данных в вашей коллекции и частоты, с которой эта операция выполняется. Поиск Linq по свойству должен будет прочитать каждый элемент / свойство в коллекции.

Если в вашей коллекции будет всего 10 элементов, и эта операция выполняется только один раз в секунду, то сканирование в прямом направлении для поиска элемента по свойству вполне вероятно будет достаточно быстрым.

Если в вашей коллекции 10 миллионов элементов, то только для пересылки или вам нужно выполнить эту операцию 100 раз в секунду, тогда вам, вероятно, понадобится некоторый индекс для этого свойства.

Если окажется, что вам нужно проиндексировать это, я бы предложил инкапсулировать эту логику в объекте. Так, например, добавление Item добавит его в основную коллекцию и добавит индексатор свойств в виде хеш-набора.

0 голосов
/ 30 декабря 2008

Действительно, LINQ будет работать нормально. Конечно, если вы знаете, что можете оптимизировать ситуацию в данном случае, вы всегда можете написать свой собственный метод расширения LINQ для более конкретного типа. Поскольку тип является более индивидуальным, ваш собственный метод следует использовать вместо предпочтительного Enumerable. Что приятно; -p

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...