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);
Но, Это выглядит грязным.
Я просто хочу знать, существует ли лучшее решение.
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
Для этого можно использовать Intersect
:
// puts all items that exists in both lists into the inBoth sequence
IEnumerable<string> inBoth = existedThings.Intersect(thingsToSave);
Проголосованные ответы предлагают алгоритм, который будет иметь сложность O (n ^ 2), если IEnumerable не был производным от класса, реализующего ICollection <>. Например, запрос Linq. Затем метод расширения Count () должен выполнить итерацию всех элементов для их подсчета. Это не круто. Вам нужно только проверить, содержит ли результат какие-либо элементы:
bool hasItemNo = existedThings.Intersect(thingsToSave).Any();
Порядок имеет значение, кстати, сделайте перечисление, которое, как вы ожидаете, будет иметь наименьшее количество элементов, аргументом Intersect ().
bool hasItemNo = existedThings.Intersect(thingsToSave).Count() > 0;
Вы даже можете предоставить свой собственный компаратор, если это необходимо: Enumerable.Intersect
Он грязный и тоже не будет работать! Ваш hasItemNo
будет истинным
, если последнее значение в existedThings
было в thingsToSave
.
Поскольку вы отметили это с помощью «Linq», я предполагаю, что этот код подойдет вам:
bool hasItemNo = thingsToSave.Intersect(existedThings).Count() > 0
Вы можете попробовать пересечь две последовательности и посмотреть, содержит ли полученная последовательность какие-либо элементы
Не совсем понятно, что вы действительно хотите здесь, но вот предложение по извлечению только тех строк, которые существуют в объектах 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;