使用C#中的列组合过滤唯一数据

时间:2013-08-31 09:29:08

标签: c# linq

我有一个如下列表:

 public class MyClass
 {
    public int val1;
    public long val2;
    public string val3;
 }
class Program
{
    static void Main(string[] args)
    {
        List<MyClass> lstData=new List<MyClass>
        {
            new MyClass{val1=1,val2=2,val3="AA"},
            new MyClass{val1=1,val2=2,val3="BB"},
            new MyClass{val1=3,val2=4,val3="AA"},
            new MyClass{val1=3,val2=4,val3="BB"},
            new MyClass{val1=1,val2=2,val3="BB"},
            new MyClass{val1=3,val2=4,val3="AA"},

        };
    }
}

我想从列表中获取唯一的行。在上面的示例中,以下列表是重复的

{val1=1,val2=2,val3="BB"}
 {val1=3,val2=4,val3="AA"}

我想消除重复的行并从列表中获取不同的行。 我怎么能这样做?

3 个答案:

答案 0 :(得分:3)

var result = lstData.GroupBy(x=>new {x.val1, x.val2, x.val3}, (x,y)=>y.First())
                    .ToList();                        

答案 1 :(得分:2)

假设您的真实班级MyClass会覆盖EqualsGetHashCode,您只需要添加Distinct

lstData = lstData.Distinct().ToList();

答案 2 :(得分:2)

您必须在GetHashCode类上实施EqualsMyClass方法,或者定义实现IEqualityComparer<MyClass>的自定义类。

public class MyClassEqualityComparer : IEqualityComparer<MyClass>
{
    private static Lazy<MyClassEqualityComparer> _instance = new Lazy<MyClassEqualityComparer>(() => new MyClassEqualityComparer());

    public static MyClassEqualityComparer Instance
    {
        get { return _instance.Value; }
    }

    private MyClassEqualityComparer() { }

    public bool Equals(MyClass x, MyClass y)
    {
        return x.val1 == y.val1 && x.val2 == y.val2 && x.val3 == y.val3;
    }

    public int GetHashCode(MyClass obj)
    {
        return obj.val1.GetHashCode() ^ obj.val2.GetHashCode() ^ obj.val3.GetHashCode();
    }
}

通过它,您将能够使用LINQ Distinct()方法:

var distinct = lstData.Distinct(MyClassEqualityComparer.Instance).ToList();