C#/LINQ选择具有相同属性的对象子列表

4
我是一个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获取myList子列表,该列表包含所有属性Text的值出现多次的myClass对象。

例如,如果我有以下内容:

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
2个回答

6
也许不是最理想的选择,但或许可以考虑:
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

我投票支持这个,它确实很好用。目前我更喜欢查询语法,因为对我来说更容易理解 :) - pierroz

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; }}

那个方案适用于有两个匹配项的情况,但是当匹配项更多时就会出现问题;所以三个匹配项会导致6个结果等等。 - Marc Gravell
@Marc - 已添加distinct以修复 :) - cjk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接