C# 使用LINQ从列表中选择不同的数据

C# 使用LINQ从列表中选择不同的数据,c#,linq,C#,Linq,我有一个包含一些属性和列表的列表。我想根据内部列表的属性选择唯一的记录如何使用LINQ实现它 例子 名单 我想选择属性“a1”具有不同值的记录。如果我发现重复值“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{a

我有一个包含一些属性和列表的列表。我想根据内部列表的属性选择唯一的记录如何使用LINQ实现它 例子 名单

我想选择属性“a1”具有不同值的记录。如果我发现重复值“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}

首先,您希望在内部列表a1中按分组,然后在该分组中选择a3=“l5”

List col=new List();
列表tmp=新列表{“l1”、“l2”、“l5”};
col.Add(新的foo{item1=1,item2=2,lst=tmp,item3=3});
tmp=新列表{“l11”、“l2”、“l3”};
col.Add(新的foo{item1=21,item2=21,lst=tmp,item3=3});
tmp=新列表{“l12”、“l2”、“l3”};
col.Add(新的foo{item1=31,item2=22,lst=tmp,item3=3});
tmp=新列表{“l1”、“l2”、“l3”};
col.Add(新foo{item1=41,item2=23,lst=tmp,item3=3});
var qry=col.GroupBy(i=>i.lst[0])。选择(g=>g.Where(j=>j.lst[2]!=“l5”);
如果在a3不是“l5”的地方有多个副本,您将获得所有副本,因此如果不需要,您可能需要筛选其他副本。

类日志
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);
        }
    }
}
{ public int DoneByEmpId{get;set;} 公共字符串DoneByEmpName{get;set;} } 公共班级1 { 静态空隙范围() { var array=new List(){new Log(){DoneByEmpId=1,DoneByEmpName=“Jon”}, 新建日志(){DoneByEmpId=1,DoneByEmpName=“Jon”}, 新建日志(){DoneByEmpId=2,DoneByEmpName=“Max”}, 新建日志(){DoneByEmpId=2,DoneByEmpName=“Max”}, 新日志(){DoneByEmpId=3,DoneByEmpName=“Peter”}; var有序= GroupBy(x=>x.DoneByEmpId).ToList().Select(x=>x.FirstOrDefault()).OrderBy(x=>x.DoneByEmpName); foreach(订单中的var项目) { Console.WriteLine(item.DoneByEmpName); } } }
结果:
乔恩
马克斯

彼得

你能提供你的课程结构吗?我不知道你是如何构建它们的(对我来说像是字典)。下面的Leppie是类似的结构Hi Jim谢谢你的尝试,但在你的例子中,你考虑的是字符串列表,而在我的例子中,它也是一个对象列表。因此i.lst[index]可能不可能。在这种情况下,您可以只访问子对象的元素。
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"));
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);
        }
    }
}