2016-02-19 4 views
0

У меня есть список объектов. Каждый объект имеет свойство Conflicts, которое представляет собой HashSet для int.Удаление подмножеств и дубликатов из списка?

Я хочу, чтобы удалить все наборы, которые являются собственными подмножествами, а также удалите все дубликаты, где дубликат, если hashsets содержат одни и те же числа:

private static List<ConflictGroup> RemoveSubsets(List<ConflictGroup> groups) 
{ 
    List<ConflictGroup> results = new List<ConflictGroup>(); 
    foreach (var group in groups) 
    { 
     results.RemoveAll(r => r.Conflicts.SetEquals(group.Conflicts)); 
     results.RemoveAll(r => r.Conflicts.IsProperSubsetOf(group.Conflicts)); 
     results.Add(group); 
    } 
    return results; 
} 

Это почти работает.

Если у меня есть:

1 
1,2 
1,2,3 

Это только держит 1,2,3.

Но если у меня есть:

1, 
1,2,3 
1,2 

Он терпит неудачу и не просто возвращает 1,2,3 ...

Я не уверен, что я должен изменить для того, чтобы работать.

ответ

1

Просто добавьте тест, если новая добавленная группа является подмножеством некоторых существующих до добавления:

if(results.Any(r => group.Conflicts.IsProperSubsetOf(r.Conflicts))){ continue; } 

Вы можете протестировать его еще до этих RemoveAll, как если бы он был подмножеством какой-либо существующей группы, в любом случае подмножество этого подмножества в результате не было (то же самое означает равенство).

1

Я предполагаю, что он возвращает последние 2 строки?

Код проходит, удаляет все СУЩЕСТВУЮЩИЕ подмножества, а затем добавляет текущий. Он должен добавлять только текущий, если THAT ONE не является подмножеством того, что уже есть.

Что происходит:

  • Процесс {1} - Ни удалены, добавьте {1}
  • Процесс {1,2,3} - 1 (Удалить правильное подмножество {1,2,3}), добавить {1,2,3}
  • Процесс {1,2} - не удален ({1,2,3} не является подмножеством {1,2}), добавить {1,2}
Смежные вопросы