проверьте существование между двумя IEnumerable

IEnumerable<String> existedThings = 
        from mdinfo in mdInfoTotal select mdinfo.ItemNo;

IEnumerable<String> thingsToSave = 
        from item in lbXReadSuccess.Items.Cast<ListItem>() select item.Value;

Вот два IEnumerable.

Я хочу проверить ли a value in existedThings существуйте в thingsToSave.

Хорошо. Я могу сделать это с 3 линейными кодами.

bool hasItemNo;
foreach(string itemNo in existedThings)
    hasItemNo= thingsToSave.Contains(itemNo);

Но, Это выглядит грязным.

Я просто хочу знать, существует ли лучшее решение.

5
задан VMAtm 27 February 2012 в 13:23
поделиться

7 ответов

 int[] id1 = { 44, 26, 92, 30, 71, 38 };
 int[] id2 = { 39, 59, 83, 47, 26, 4, 30 };

 IEnumerable<int> both = id1.Intersect(id2);

 foreach (int id in both)
     Console.WriteLine(id);

 //Console.WriteLine((both.Count() > 0).ToString());
 Console.WriteLine(both.Any().ToString());

Найдите метод Enumerable.Intersect

8
ответ дан 18 December 2019 в 05:39
поделиться

Для этого можно использовать Intersect :

// puts all items that exists in both lists into the inBoth sequence
IEnumerable<string> inBoth = existedThings.Intersect(thingsToSave);
4
ответ дан 18 December 2019 в 05:39
поделиться

Проголосованные ответы предлагают алгоритм, который будет иметь сложность O (n ^ 2), если IEnumerable не был производным от класса, реализующего ICollection <>. Например, запрос Linq. Затем метод расширения Count () должен выполнить итерацию всех элементов для их подсчета. Это не круто. Вам нужно только проверить, содержит ли результат какие-либо элементы:

 bool hasItemNo = existedThings.Intersect(thingsToSave).Any();

Порядок имеет значение, кстати, сделайте перечисление, которое, как вы ожидаете, будет иметь наименьшее количество элементов, аргументом Intersect ().

8
ответ дан 18 December 2019 в 05:39
поделиться
bool hasItemNo = existedThings.Intersect(thingsToSave).Count() > 0;

Вы даже можете предоставить свой собственный компаратор, если это необходимо: Enumerable.Intersect

4
ответ дан 18 December 2019 в 05:39
поделиться

Он грязный и тоже не будет работать! Ваш hasItemNo будет истинным , если последнее значение в existedThings было в thingsToSave .

Поскольку вы отметили это с помощью «Linq», я предполагаю, что этот код подойдет вам:

bool hasItemNo = thingsToSave.Intersect(existedThings).Count() > 0
3
ответ дан 18 December 2019 в 05:39
поделиться

Вы можете попробовать пересечь две последовательности и посмотреть, содержит ли полученная последовательность какие-либо элементы

2
ответ дан 18 December 2019 в 05:39
поделиться

Не совсем понятно, что вы действительно хотите здесь, но вот предложение по извлечению только тех строк, которые существуют в объектах thingstoSave и existedThings.

IEnumerable<String> existedThings = 
        from mdinfo in mdInfoTotal select mdinfo.ItemNo;

IEnumerable<String> thingsToSave = 
        from item in lbXReadSuccess.Items.Cast<ListItem>() 
        where existedThings.Contains(item.Value)
        select item.Value;
2
ответ дан 18 December 2019 в 05:39
поделиться
Другие вопросы по тегам:

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