2009-07-28 121 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

相關問題