List的並集、交集、差集


並集:List<xx> union =arps.Union(flts).ToList();
交集:List<xx> inters = arps.Intersect(flts)ToList();
差集:List<xx> except= arps.Except(flts)ToList();

補充:

如果要自定義兩個對象認為相等的條件,需補充compary<>參數。如:

    VOR v1 = new VOR("V1", "ZBAA", "ZY");
            VOR v2 = new VOR("V2", "ZBAA", "ZB");
            VOR v3 = new VOR("V3", "ZUUU", "ZU");
            VOR v4 = new VOR("V4", "ZGGG", "ZG");
            VOR v5 = new VOR("V5", "ZSSS", "ZS");
            VOR v6 = new VOR("V6", "ZUUU", "ZU");

 

    List<VOR> a = new List<VOR>();

            a.Add(v1);             a.Add(v2);             a.Add(v3);

            List<VOR> b = new List<VOR>();

            b.Add(v4);             b.Add(v5);            b.Add(v6);

           

    List<VOR> jiao = a.Intersect(b, new MyComPare()).ToList(); //在有比較函數情況下返回 v3,無比較函數時返回空

            List<VOR> bin = a.Union(b, new MyComPare()).ToList();     //在有比較函數情況下返回 v1~v5(v3和v6認為相等),無比較函數時返回v1~v6

            List<VOR> ca = a.Except(b, new MyComPare()).ToList();    //在有比較函數情況下返回 v1、v2(v3和v6認為相等),無比較函數時返回v1、v2、v3

 

//自定義比較函數

public class MyComPare : IEqualityComparer<VOR>        

{

//重點是此相等條件和哈希函數的理解             

// Euquals用於確定兩對象認為相等的條件,相關的Intersect、Union、Execpt等函數都是根據此函數返回的bool值判斷兩對象是否相等

//但是,這兩個對象還必須保證哈希函數返回值也相等才能最終認為相等

//也就是說要同時滿足這兩個函數條件才能認為相等,缺一不可

//一般可以設置 哈希返回值就是對象.ToString(),保證比較的兩個對象是同一類型的就可滿足此哈希條件。這樣就只用考慮Equals函數

 

    public bool Equals(VOR x, VOR y) //此處認為若兩vor的后兩個屬性相同就相等。

    {

              return x.fir+x.icd==y.fir+y.icd;                     

    }           

           public int GetHashCode(VOR n) 

             {

                 return n.ToString().GetHashCode();

             }        

}

 

//如果List成員時數組,比較函數應類似

public class ArrayComPare : IEqualityComparer<string[]>

        {

            public bool Equals(string[] x, string[] y)

            {

                if (x.Length != y.Length) return false;

 

                //這里可以靈活設置兩個元素的比較條件,如支持不對最后一位數組比較等

                for (int i = 0; i < x.Length; i++)

                    if (x[i] != y[i]) return false;

 

                return true;

 

            }

 

            public int GetHashCode(string[] n)

            {

                return n.ToString().GetHashCode(); //對數組類的比較,一定要Tostring()后再去哈希值,否則哈希值不同,兩個對象始終會比較不同。

            }

        }

 

 

 

 

關於List的交集和並集的東西,上代碼

復制代碼
  class Program { static void Main(string[] args) { List<Fish> a = new List<Fish>(); a.Add(new Fish() {Name="測試1",ID=0,Message="" }); a.Add(new Fish() { Name = "測試2", ID = 1, Message = "" }); a.Add(new Fish() { Name = "測試3", ID = 2, Message = "" }); a.Add(new Fish() { Name = "測試4", ID = 3, Message = "" }); List<Fish> b = new List<Fish>(); b.Add(new Fish() { Name = "測試1", ID = 0, Message = "" }); b.Add(new Fish() { Name = "測試3", ID = 5, Message = "" }); b.Add(new Fish() { Name = "測試5", ID = 6, Message = "" }); List<Fish> c = a.Union(b).ToList();   //List<Fish> c = a.Intersect(b).ToList(); foreach (var item in c) { Console.WriteLine("Name:{0},ID:{1}", item.Name, item.ID); } Console.ReadLine(); } } public class Fish { public string Name { get; set; } public int ID { get; set; } public string Message { get; set; } }
復制代碼

一個簡單的測試類有三個屬性,現在我想取a和b的並集,結果如下:

結果並不是我想要的,“測試1”這個結果應該顯示一次就夠了,而 List<Fish> c = a.Intersect(b).ToList();顯示的結果更是空白,這是怎么回事兒? 來看一下Union的原型

復制代碼
        //
        // 摘要: // 通過使用默認的相等比較器生成兩個序列的並集。 // // 參數: // first: // 一個 System.Collections.Generic.IEnumerable<T>,它的非重復元素構成聯合的第一個集。 // // second: // 一個 System.Collections.Generic.IEnumerable<T>,它的非重復元素構成聯合的第二個集。 // // 類型參數: // TSource: // 輸入序列中的元素的類型。 // // 返回結果: // 一個 System.Collections.Generic.IEnumerable<T>,包含兩個輸入序列中的元素(重復元素除外)。 // // 異常: // System.ArgumentNullException: // first 或 second 為 null。 public static IEnumerable<TSource> Union<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second); // // 摘要: // 通過使用指定的 System.Collections.Generic.IEqualityComparer<T> 生成兩個序列的並集。 // // 參數: // first: // 一個 System.Collections.Generic.IEnumerable<T>,它的非重復元素構成聯合的第一個集。 // // second: // 一個 System.Collections.Generic.IEnumerable<T>,它的非重復元素構成聯合的第二個集。 // // comparer: // 用於對值進行比較的 System.Collections.Generic.IEqualityComparer<T>。 // // 類型參數: // TSource: // 輸入序列中的元素的類型。 // // 返回結果: // 一個 System.Collections.Generic.IEnumerable<T>,包含兩個輸入序列中的元素(重復元素除外)。 // // 異常: // System.ArgumentNullException: // first 或 second 為 null。 public static IEnumerable<TSource> Union<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second, IEqualityComparer<TSource> comparer);
復制代碼

還有一個重載函數,還有一個比較器 那咱們就寫一個比較器唄

復制代碼
    public class FishComPare : IEqualityComparer<Fish> { public bool Equals(Fish x, Fish y) { return x.Name == y.Name && x.ID==y.ID; } public int GetHashCode(Fish obj) { return obj.Name.GetHashCode(); } }
復制代碼

然后全部代碼

復制代碼
   class Program { static void Main(string[] args) { List<Fish> a = new List<Fish>(); a.Add(new Fish() { Name = "測試1", ID = 0, Message = "" }); a.Add(new Fish() { Name = "測試2", ID = 1, Message = "" }); a.Add(new Fish() { Name = "測試3", ID = 2, Message = "" }); a.Add(new Fish() { Name = "測試4", ID = 3, Message = "" }); List<Fish> b = new List<Fish>(); b.Add(new Fish() { Name = "測試1", ID = 0, Message = "" }); b.Add(new Fish() { Name = "測試3", ID = 5, Message = "" }); b.Add(new Fish() { Name = "測試5", ID = 6, Message = "" }); List<Fish> c = a.Union(b,new FishComPare()).ToList(); //List<Fish> c = a.Intersect(b,,new FishComPare()).ToList(); foreach (var item in c) { Console.WriteLine("Name:{0},ID:{1}", item.Name, item.ID); } Console.ReadLine(); } } public class Fish { public string Name { get; set; } public int ID { get; set; } public string Message { get; set; } } public class FishComPare : IEqualityComparer<Fish> { public bool Equals(Fish x, Fish y) { return x.Name == y.Name && x.ID==y.ID; } public int GetHashCode(Fish obj) { return obj.Name.GetHashCode(); } }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM