2013-07-11 1 views
-4

Я бы хотел сравнить 2 списка массивов. Возьмем, например, этот пример:Linq сравнить 2 списка массивов

List<int[]> list1 = new List<int[]>() { new int[4] { 1, 2, 3, 4 }, new int[4] { 1, 2, 3, 5 } }; 
List<int[]> list2 = new List<int[]>() { new int[2] { 1, 2 }, new int[2] { 3, 4 }, new int[2] { 3, 5 } }; 

Я хотел бы знать, для каждого элемента в list1 для расчета для каждого элемента в списке 2, как много общих элементов у них есть.

Ex. 1,2,3,4 по сравнению с 1,2 приведет к 2 соответствующим элементам. 1,2,3,4 по сравнению с 3,5 приведет к 1 соответствующему элементу.

Это не дублируется, поскольку я не хочу сравнивать обычные списки. Я хочу видеть для каждой записи в списке1, сколько элементов из списка2 содержит количество общих элементов.

+0

@ SonerGönül и wudzik and FerretalicA это не дублирование. это не регулярное сравнение двух регулярных списков. Пожалуйста, прочтите более внимательно. – George87

ответ

0

Вы бы сделать что-то вроде этого:

var results = 
    from x in list1.Select((array, index) => new { array, index }) 
    from y in list2.Select((array, index) => new { array, index }) 
    select new 
    { 
     list1_index = x.index, 
     list2_index = y.index, 
     count = x.array.Intersect(y.array).Count() 
    }; 

foreach(var r in results) 
{ 
    Console.WriteLine("({0}, {1}) have {2} item(s) in common.", r.list1_index, r.list2_index, r.count); 
} 
// (0, 0) have 2 item(s) in common. 
// (0, 1) have 2 item(s) in common. 
// (0, 2) have 1 item(s) in common. 
// (1, 0) have 2 item(s) in common. 
// (1, 1) have 1 item(s) in common. 
// (1, 2) have 2 item(s) in common. 
+0

Отсутствие аргументов формата WriteLine – SimpleVar

+0

Это наиболее полный ответ. Большое спасибо. – George87

1

Вы можете найти Enumerable.Intersect, чтобы узнать об общих деталях, найденных во втором списке.

var commonList = list1.Intersect(list2); 

Пересечение двух множеств А и В определяются как набор, который содержит все элементы А, также появляется в B, но никаких других элементов

Редактировать Поскольку у вас есть массив как элемент списка, вам нужно пройти через каждый элемент списка.

List<int[]> list1 = new List<int[]>() { new int[4] { 1, 2, 3, 4 }, new int[4] { 1, 2, 3, 5 } }; 
List<int[]> list2 = new List<int[]>() { new int[2] { 1, 2 }, new int[2] { 3, 4 }, new int[2] { 3, 5 } }; 
List<int[]> list3 = new List<int[]>(); 
for (int i = 0; i < list1.Count; i++) 
{ 
    list3.Add(list1[i].Intersect(list2[i]).ToArray()); 
} 
0
var commons = list1.Select(x => list2.Select(x.Intersect).ToArray()).ToArray(); 

Console.WriteLine(commons[0][0]); // Commons between list1[0] and list2[0] 
Console.WriteLine(commons[0][1]); // Commons between list1[0] and list2[1] 
Console.WriteLine(commons[3][0]); // Commons between list1[3] and list2[0] 

Console.WriteLine(commons[3][0].Length); // Number of commons between [3] and [0] 
+0

Не работает как следует – George87

1
List<int[]> list1 = new List<int[]>() { new int[4] { 1, 2, 3, 4 }, new int[4] { 1, 2, 3, 5 } }; 
List<int[]> list2 = new List<int[]>() { new int[2] { 1, 2 }, new int[2] { 3, 4 }, new int[2] { 3, 5 } }; 

var results = list1.Select(x => list2.Select(y => y.Intersect(x).Count()).ToList()).ToList(); 

Результат содержит следующие данные: [ [ 2, 2, 1 ], [ 2, 1, 2 ] ]

+0

Спасибо, что ответ прост и решает мою проблему. – George87

+0

+1 Чище, чем у меня. Я не мог придумать хороший способ выражения индекса каждого массива в его соответствующем списке без анонимного типа. –

0

Accourding ур требования, я думаю, что в C# там не такие inbuild в списке, который делает именно то, что вы хотите, но следующая функция возвращает именно то, что вам нужно в результате Список. Надеюсь, это поможет вам.

private List<int> MatchList() 
    { 
     List<int[]> list1 = new List<int[]>() { new int[4] { 1, 2, 3, 4 }, new int[4] { 1, 2, 3, 5 } }; 
     List<int[]> list2 = new List<int[]>() { new int[2] { 1, 2 }, new int[2] { 3, 4 }, new int[2] { 3, 5 } }; 
     List<int> resultList = new List<int>(); 

     for (int i = 0; i < list1.Count; i++) 
     { 
      for (int j = 0; j < list2.Count; j++) 
      { 
       if (i == j) 
       { 
        int result = 0; 

        foreach (int list1Element in list1[i]) 
        { 
         foreach (int list2Element in list2[j]) 
         { 
          if (list1Element == list2Element) 
          { 
           result +=1; 
          } 
         } 
        } 

        resultList.Add(result); 
       } 
      } 
     } 
     return resultList; 
    } 
+0

Я уже сделал это с такой функцией, я просто хотел расширить свой горизонт и сделать это с помощью linq и plinq, поскольку это может быть быстрее. – George87

 Смежные вопросы

  • Нет связанных вопросов^_^