2009-07-28 126 views
3

我与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 }); 

我应该有对象AB在我的子表

回答

5

也许并不理想,但也许:

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 
+0

我投这一个伟大的工程确实 和我喜欢的查询语法的那一刻,更容易理解对我来说: ) – PierrOz 2009-07-28 13:40:28

1

这工作:

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

相关问题