我有一个如下列表:
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"}
我想消除重复的行并从列表中获取不同的行。 我怎么能这样做?
答案 0 :(得分:3)
var result = lstData.GroupBy(x=>new {x.val1, x.val2, x.val3}, (x,y)=>y.First())
.ToList();
答案 1 :(得分:2)
假设您的真实班级MyClass
会覆盖Equals
和GetHashCode
,您只需要添加Distinct
:
lstData = lstData.Distinct().ToList();
答案 2 :(得分:2)
您必须在GetHashCode
类上实施Equals
和MyClass
方法,或者定义实现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();