2015-04-11 3 views
0

У меня есть список элементов, как показано ниже.C# - поиск общих элементов в списке целых чисел

List<List<int>> testItems=new List<List<int>>(); 

Я добавил к нему такие вещи.

List<int> item=new List<item>(); 
item.clear(); 

item.Add(3); 
item.Add(5); 
item.Add(7); 

testItems.Add(item); 

item.clear(); 
item.Add(10); 
item.Add(3); 

testItems.Add(item); 

item.clear(); 
item.Add(1); 
item.Add(8); 
item.Add(3); 
item.Add(9); 

testItems.Add(item); 

Теперь то, что я хочу сделать, я хочу, чтобы извлечь элементы, общие для всех списков и добавить его в другой список под названием finalList.

List<int> finalList = new List<int>(); 

Я пробовал следующее.

int count; 
foreach (List<int> a in testItems) 
{ 
    count = 0; 
    foreach (int b in a) 
    { 
     foreach (List<int> c in testItems) 
     { 
      foreach (int d in c) 
      { 
       if (d == b) 
       { 
        count++; 
        break; 
       } 
      } 
     } 
     if (count == a.Count) 
      finalList.Add(b); 
    } 
} 

Я знаю, что это решение не является оптимальным и не обеспечивает то, что мне нужно. Он может добавить один и тот же элемент несколько раз. Может ли кто-нибудь помочь мне исправить это?

+1

_Все листы? У вас только один список (внутри другого списка). Вы добавляете к нему элементы и очищаете их, а не создаете новый список. Кроме того, вы можете более подробно объяснить, какова цель этого кода, и каков желаемый результат? –

+0

Что я имею в виду под «всеми списками» - это набор списков, содержащихся в testItems. Это список целых чисел. Это длинный код. Созданный список (finalList) будет использоваться в какой-либо другой части кода –

+0

Обязательно ли вы используете списки? Использование [HashSet ] (http://msdn.microsoft.com/en-us/library/bb359438 (v = vs.110) .aspx) представляется более подходящим (и эффективным) для вашего случая здесь –

ответ

2

Ваш код для добавления элементов не включает три разных элемента. Как вы повторно деталь, код эквивалентен:

List<int> item=new List<int>(); 
    item.Add(1); 
    item.Add(8); 
    item.Add(3); 
    item.Add(9); 

    testItems.Add(item); 
    testItems.Add(item); 
    testItems.Add(item); 

Вам нужно создать новые элементы вместо использования один и тот же предмет:

List<int> item = new List<int>(); 
    item.Add(3); 
    item.Add(5); 
    item.Add(7); 
    testItems.Add(item); 

    item = new List<int>(); 
    item.Add(10); 
    item.Add(3); 
    testItems.Add(item); 

    item = new List<int>(); 
    item.Add(1); 
    item.Add(8); 
    item.Add(3); 
    item.Add(9); 
    testItems.Add(item); 

Для более эффективного способа получения номера общего по всем пунктам вы можете просмотреть все значения в первом элементе и проверить, существует ли во всех других товарах:

List<int> finalList = 
    testItems[0].Where(
    i => testItems.Skip(1).All(x => x.Contains(i)) 
).ToList(); 
+0

Спасибо! Это сработало ! –

1

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

вы получите что-то вроде этого:

IEnumerable<int> result = testItems[0]; 
for(int i = 1; i < testItems.Count; i++) 
{ 
    result = result.Intersect(testItems[i]); 
} 

Вы получаете пересечение в переменной результата.

Но вы действительно уверены, что вам нужен этот странно выглядящий список списков?

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