C# 使用LINQ从列表中选择不同的数据
我有一个包含一些属性和列表的列表。我想根据内部列表的属性选择唯一的记录如何使用LINQ实现它 例子 名单 我想选择属性“a1”具有不同值的记录。如果我发现重复值“a1”,则我将比较值“a3”!=“l5” 预期结果: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
{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);
}
}
}