C#/ LINQ选择对象的子表具有相同属性
问题描述:
我与LINQ初学者,我想知道是否可以用它来解决以下问题:C#/ LINQ选择对象的子表具有相同属性
我有一个类:
public class myClass
{
public int Id { get; set; }
public int Category { get; set; }
public string Text { get; set; }
}
而我有一个myClass
对象的列表。
public List<myClass> myList;
我可以很容易地使用LINQ获得的包含所有myClass
对象,其属性Text
的值不止一次现在更myList
子列表。
例如,如果我有
myClass A = new myClass { Id=1, Category=1, Text="Hello World!"};
myClass B = new myClass { Id=2, Category=2, Text="Hello World!"};
myClass C = new myClass { Id=3, Category=2, Text="Good Bye!"};
myList.AddRange(new []{ A, B, C });
我应该有对象A
和B
在我的子表
答
也许并不理想,但也许:
var result = myList.GroupBy(x=>x.Text).Where(grp => grp.Count() > 1)
.SelectMany(x=>x); // .ToList() if you want a list
或者在查询语法:
var result = from x in myList
group x by x.Text into grp
where grp.Count() > 1
from y in grp
select y; // .ToList() if you want a list
答
这工作:
var sublist = (from a in myList
from b in myList
where a.Text == b.Text
&& a.Id != b.Id
select a).Distinct();
测试程序:
void Main()
{
myClass A = new myClass { Id=1, Category=1, Text="Hello World!"};
myClass B = new myClass { Id=2, Category=2, Text="Hello World!"};
myClass C = new myClass { Id=3, Category=2, Text="Good Bye!"};
myClass D = new myClass { Id=4, Category=7, Text="Hello World!"};
List<myClass> myList = new List<myClass>();
myList.AddRange(new []{ A, B, C, D });
var sublist = (from a in myList
from b in myList
where a.Text == b.Text
&& a.Id != b.Id
select a).Distinct();
sublist.Dump();
}
public class myClass{ public int Id { get; set; } public int Category { get; set; } public string Text { get; set; }}
+0
当2个匹配时有效,但有更多时爆炸;所以3个匹配结果有6个结果,等等。 – 2009-07-28 13:29:57
我投这一个伟大的工程确实 和我喜欢的查询语法的那一刻,更容易理解对我来说: ) – PierrOz 2009-07-28 13:40:28