2016-12-30 2 views
-5

Как удалить дубликаты из списка объектов на основе условия

var incidents = new List<SMIncident>(); 
 
while (reader.Read()) 
 
{ 
 
    SMIncident smIncident = new SMIncident(); 
 
    smIncident.GCSSReferenceNo = reader.GetString(0); 
 
    smIncident.assignmentGroup = reader.GetString(1); 
 
    incidents.Add(smIncident); 
 
}

List

Мне нужно удалить дубликаты из списка на основе определенного состояния. Например,

xxxx t1 
 
yyyy t2 
 
zzzz t1 
 
xxxx t4 
 
xxxx t2

1) Нужно проверить, если список содержит дубликаты, 2) если дубликаты есть, то проверьте, если дублирует имеет значение t4, 3), если t4 там, то игнорировать все. Так что в основном, мне нужен список с yyyy -> t2, zzzz -> t1 этими значениями.

второй сценарий:

xxxx t1 
 
yyyy t2 
 
zzzz t1 
 
xxxx t2

1) Нужно проверить, если список содержит дубликаты, 2) если дубликаты есть, то проверьте, если дублирует имеет значение t4 , 3) если нет t4, тогда он должен иметь все эти значения в списке , так что в основном, мне нужен список с xxxx -> t1, yyyy -> t2, zzzz -> t1, xxxx -> t2 эти значения.

+0

Что вы попробовать? в какой форме ваши списки? показать код, показать, что вы попробовали, показать нам, что мы должны работать с – BugFinder

+0

, вставляем образ фрагмента кода. инциденты - это объект списка. Необходимо манипулировать списком. –

+0

Вы явно не читали правила сайта - публикация изображений с кодом не является хорошей идеей, как если бы кто-то думал, что это может быть применимо к ним .. этот образ может пойти. Im тоже не блуждает на другие сайты, чтобы посмотреть на blury изображения кода – BugFinder

ответ

2

Попробуйте этот пример на основе вашей абстракции:

class AbstractList { public string field1; public string field2; } 

List<AbstractList> lst = new List<AbstractList> { 
        new AbstractList() { field1 = "xxxx", field2="t8"}, 
        new AbstractList() { field1 = "xxxx", field2="t1"}, 
        new AbstractList() { field1 = "xxxx", field2="t5"}, 
        new AbstractList() { field1 = "yyyy", field2="t1"}, 
        new AbstractList() { field1 = "yyyy", field2="t3"}, 
        new AbstractList() { field1 = "zzzz", field2="t1"}, 
        new AbstractList() { field1 = "zzzz", field2="t4"}, 
        new AbstractList() { field1 = "xxxx", field2="t5"} 
        }; 



var res = from lstElement in lst 
      where 
      (
       //following linq sub-expression get an exclusion sequence for your purpose 
       from el_lstGrouped in 
       (
       from i in lst 
       group i by new { i.field1 } into lstGrouped 
       where lstGrouped.Count() > 1 
       select lstGrouped 
      ).SelectMany(g => g) 
       where el_lstGrouped.field2 == "t4" 
       select new 
       { 
       Field1 = el_lstGrouped.field1, 
       Field2 = el_lstGrouped.field2 
       } 
      ).All(excluded => excluded.Field1 != lstElement.field1) 
       select lstElement; 

foreach(var item in res)   
    Console.WriteLine($"{item.field1} - {item.field2}"); 

попробовать фрагмент кода: http://volatileread.com/utilitylibrary/snippetcompiler?id=99262

+1

отлично работает .. Большое спасибо. –

+0

Я рад, спасибо .. вы приветствуете –

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