2015-02-03 3 views
0

Я сравниваю 2 списка, и мне нужно собирать вхождения подмножества (modulesToDelete) из главного списка (allModules) ТОЛЬКО, когда найдено более одного вхождения. (allModules содержит modulesToDelete). Множество вхождений любого модуля в modulesToDelete означает, что эти модули совместно используются. Одно вхождение модуля в modulesToDelete означает, что модуль изолирован и безопасен для удаления (он просто обнаружил себя). Я могу сделать это с помощью вложенных циклов по каждому элементу, но это, насколько я с выражением LINQ (который не работает) собирать:LINQ: сравнить два списка и подсчитать подсети

List<Module> modulesToDelete = { A, B, C, K } 
List<string> allModules = {R, A, B, C, K, D, G, T, B, K } // need to flag B and K 

var mods = from mod in modulesToDelete 
where allModules.Any(name => name.Contains(mod.Name) && mod.Name.Count() > 1) 
select mod; 

здесь мой вложенный цикл просмотра, которые я хочу, чтобы заменить с помощью LINQ выражение:

foreach (Module mod in modulesToDelete) 
{ 
    int count = 0; 
    foreach (string modInAllMods in allModules) 
    { 
     if (modInAllMods == mod.Name) 
     { 
      count++; 
     } 
    } 

    if (count > 1) 
    { 
     m_moduleMarkedForKeep.Add(mod); 
    } 
    else if(count == 1) 
    { 
     // Delete the linked modules 
    } 
} 

ответ

0

Вы можете использовать поиск, который похож на словарь, но позволяет несколько одинаковых ключей и возвращает IEnumerable<T> в качестве значения.

var nameLookup = modulesToDelete.ToLookup(m => m.Name); 
var safeToDelete = modulesToDelete.Where(m => nameLookup[m.Name].Count() == 1); 
var sharedModules = modulesToDelete.Where(m => nameLookup[m.Name].Count() > 1); 

Edit: Тем не менее, я не вижу, как allModules связано вообще.

Вероятно, проще и с желаемым результатом на ваших данных образца:

var mods = modulesToDelete.Where(m => allModules.Count(s => s == m.Name) > 1); 
+0

Спасибо! Это заставляет меня возглавить в правильном направлении. Я добавил еще несколько примеров данных и пробовал это: ... safeToDelete = allModules.Where (m => m ....); –

+0

@TanHur: взгляните на мой добавленный подход, который еще проще. –

+0

Я пробовал несколько вариантов, но я всегда получаю это: mods = {A, B, C, K, B, K} Мне нужно это: mods = {B, K} –

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