Используя SequenceEqual и затем возвращая, какие элементы не совпадают - PullRequest
5 голосов
/ 01 декабря 2011

У меня есть два List<string>, и я использую метод SequenceEqual, чтобы определить, совпадают ли они.

Теперь мне нужно получить List<int>, string, IEnumerable, любой из индексов элементов, которые потерпели неудачу.

Есть ли простой способ?

Спасибо

Ответы [ 6 ]

3 голосов
/ 01 декабря 2011

Я думаю, что вы хотите:

List<string> list1 = ...
List<string> list2 = ...

var differentIndices = list1.Zip(list2, (item1, item2) => item1 == item2)
                            .Select((match, index) => new { Match = match, Index = index })
                            .Where(a => !a.Match)
                            .Select(a => a.Index);

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

2 голосов
/ 02 декабря 2011

Звучит так, будто вы хотите противоположность «пересечения». Пересечение - это элементы, которые существуют в обоих списках ... и вы хотите, чтобы элементы, которые не существовали в обоих списках.
Вот простой способ сделать это:

var items = first.Union(second).Except(first.Intersect(second));

Пример:

var first = new[]{"A","B","C","D"};
var second = new[]{"C","D","E","F"};

var items = first.Union(second).Except(first.Intersect(second));
// Result: "A","B", "E","F"
2 голосов
/ 01 декабря 2011

Вы можете использовать LINQ:

var firstFiltered = firstList.Except(secondList);
var secondFiltered = secondList.Except(firstList);

var bothFiltered = firstFiltered.Concat(secondFiltered);

Примечание: я уверен, что есть более эффективный способ сделать это ...

1 голос
/ 01 декабря 2011

Допустим, ваши списки list1 и list2

 IEnumerable<string> setDifferent =
          list1.Except(list2);

Вышеприведенное даст вам все элементы в list1, которых нет в list2

0 голосов
/ 02 декабря 2011

Если списки могут быть разной длины, вы можете сделать что-то вроде этого:

IList<string> first = new List<string> { "A", "B", "C", "D", "E", "F" };
IList<string> second = new List<string> { "A", "Z", "C", "D", "Y" };

IList<string> longer = first;
IList<string> shorter = second;

IEnumerable<int> differentIndices = longer.Select((s, i) => i > shorter.Count - 1 || !s.Equals(shorter[i]) ? i : -1).Where(n => n >= 0);

Console.WriteLine(string.Join(", ", differentIndices));

Это фактически одна строка.Результаты для этого примера: "1, 4, 5".

. Ключевым моментом является то, что Select отображает совпадающие индексы на -1, и они затем отфильтровываются с помощью Where.

0 голосов
/ 01 декабря 2011

используйте это.

var diff = l1.Except(l2);  
Array.ForEach(diff.ToArray(), r => Console.WriteLine(r));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...