2017-01-02 3 views
0

У меня есть список, который содержит некоторые свойства и список. Я хочу, чтобы выбрать уникальные записи на основе свойства внутреннего списка, как я могу достичь его с помощью LINQ Пример Списоквыберите отдельные данные из списка, используя LINQ

{item1 = 1, item2=2,list{a1=l1,a2=l2,a3=l5},item3 =3} 
{item1 = 21, item2=21,list{a1=l11,a2=l2,a3=l3},item3 =3} 
{item1 = 31, item2=22,list{a1=l12,a2=l2,a3=l3},item3 =3} 
{item1 = 41, item2=23,list{a1=l1,a2=l2,a3=l3},item3 =3} 

Я хочу, чтобы выбрать запись, которая имеет отчетливое значение свойства «a1» .Если I найдено дубликата значение «a1», то я буду сравнивать значение «a3» = «L5»

Ожидаемый результат:

{item1 = 21, item2=21,list{a1=l11,a2=l2,a3=l3},item3 =3} 
{item1 = 31, item2=22,list{a1=l12,a2=l2,a3=l3},item3 =3} 
{item1 = 41, item2=23,list{a1=l1,a2=l2,a3=l3},item3 =3} 
+0

Можете ли вы представить структуру ваших классов? Я не уверен, что понял, как вы их построили (выглядит как dictionnary для меня) – fharreau

+0

Leppie ниже аналогичная структура – Pavan

ответ

0

Сначала вы хотите GroupBy на своем внутреннем списке a1, а затем выбрать в пределах этой группировки для a3! = "l5".

List<foo> col = new List<foo>(); 
List<string> tmp = new List<string> {"l1","l2","l5"}; 
col.Add(new foo {item1 = 1, item2=2,lst=tmp,item3 =3}); 
tmp = new List<string> {"l11","l2","l3"}; 
col.Add(new foo {item1 = 21, item2=21,lst=tmp,item3 =3}); 
tmp = new List<string> {"l12","l2","l3"}; 
col.Add(new foo {item1 = 31, item2=22,lst=tmp,item3 =3}); 
tmp = new List<string> {"l1","l2","l3"}; 
col.Add(new foo {item1 = 41, item2=23,lst=tmp,item3 =3}); 

var qry = col.GroupBy(i => i.lst[0]).Select(g => g.Where(j => j.lst[2]!="l5")); 

Если есть несколько дубликатов, где ваш a3 не «l5» вы получите все из них, так что вы, возможно, придется фильтровать на что-то другое, если это не требуется.

+0

Привет, Джим спасибо за попытку, но в вашем случае вы рассматриваете список строк, тогда как в моем случае это также список объектов , Поэтому i.lst [index] может оказаться невозможным. – Pavan

+0

В этом случае вы можете просто получить доступ к элементам под-объекта. –

0
class Log 
{ 
    public int DoneByEmpId { get; set; } 
    public string DoneByEmpName { get; set; } 

    } 

public class Class1 
{ 
    static void Range() 
    { 
     var array = new List<Log>() {new Log() {DoneByEmpId = 1,DoneByEmpName = "Jon"}, 
      new Log() { DoneByEmpId = 1, DoneByEmpName = "Jon" } , 
      new Log() { DoneByEmpId = 2, DoneByEmpName = "Max" }, 
      new Log() { DoneByEmpId = 2, DoneByEmpName = "Max" }, 
      new Log() { DoneByEmpId = 3, DoneByEmpName = "Peter" }}; 

     var ordered = 
      array.GroupBy(x => x.DoneByEmpId).ToList().Select(x => x.FirstOrDefault()).OrderBy(x => x.DoneByEmpName); 
     foreach (var item in ordered) 
     { 
      Console.WriteLine(item.DoneByEmpName); 
     } 
    } 
} 

Результат:
Jon
Макс
Питер

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