2013-08-31 38 views
0

我有一個列表獨特的數據如下:篩選在C#中的列組合

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"}, 

     }; 
    } 
} 

我想唯一行了list.In下面列出了上面的例子是重複

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

我想消除重複的行並從列表中獲取不同的行。 我該怎麼做?

回答

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

假設你真正的類MyClass覆蓋EqualsGetHashCode,所有你需要的是增加Distinct

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

你必須要麼實現您MyClassGetHashCodeEquals方法,或定義自定義實現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();