Подтвердить что ты не робот

Найдите пересечение двух списков в linq?

У меня есть список int A, B. Мне нравится делать следующий шаг в linq

list<int> c = new List<int>();

for (int i = 0; i < a.count; i++)
{
    for (int j = 0; j < b.count; j++)
    {
        if (a[i] == b[j])
        {
            c.add(a[i]);
        }
    }
}

если его a и b являются object, мне нужно проверить определенные свойства, подобные этому, и добавить список, если он равен тому, как я могу это сделать в linq?

4b9b3361

Ответ 1

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

var c = a.Intersect(b);

Это возвращает все значения как в a, так и в b. Однако позиция элемента в списке не принимается во внимание.

Ответ 2

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

var a = new List<int>();
var b = new List<int>();

var c = a.Intersect(b);

Ответ 3

В LINQ эквивалент вашего кода:

var c = from i in Enumerable.Range(0, a.Count)
        from j in Enumerable.Range(0, b.Count)
        where a[i] == b[j]
        select a[i];

var cList = c.ToList();

Но это гораздо приятнее сделать:

var c = from aItem in a 
        join bItem in b on aItem equals bItem
        select aItem;

var cList = c.ToList();

Но это не фильтрует дубликаты. Чтобы полностью фильтровать дубликаты, вы можете:

var cList = a.Intersect(b).ToList();

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

var aSet = new HashSet<int>(a);
var cList = b.Where(aSet.Contains)
             .ToList(); 

Ответ 4

Создайте список c, содержащий все элементы, которые присутствуют в обоих списках a и b:

List<int> c = a.Intersect(b).ToList();

Ответ 5

Как замечает Крис в своем комментарии к исходному вопросу, представленный пример кода будет возвращать дубликаты в списке c (подробности см. в его комментарии). Пересечение будет возвращать только отдельные значения. Чтобы дублировать поведение исходного кода примера, попробуйте следующее:

var c = (from value in a
         where b.Contains(a)
         select a);

Ответ 6

Используйте этот код.... Это определенно поможет вам...

class CompareLists
{        
    static void Main()
    {
        // Create the IEnumerable data sources.
        string[] names1 = System.IO.File.ReadAllLines(@"../../../names1.txt");
        string[] names2 = System.IO.File.ReadAllLines(@"../../../names2.txt");

        // Create the query. Note that method syntax must be used here.
        IEnumerable<string> differenceQuery =
          names1.Except(names2);

        // Execute the query.
        Console.WriteLine("The following lines are in names1.txt but not names2.txt");
        foreach (string s in differenceQuery)
            Console.WriteLine(s);

        // Keep the console window open in debug mode.
        Console.WriteLine("Press any key to exit");
        Console.ReadKey();
    }
}
/* Output:
     The following lines are in names1.txt but not names2.txt
    Potra, Cristina
    Noriega, Fabricio
    Aw, Kam Foo
    Toyoshima, Tim
    Guy, Wey Yuan
    Garcia, Debra
     */