最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

.NET中求復雜類型集合的差集、交集、并集

 更新時間:2022年07月28日 14:31:17   作者:清風不在已徐來  
這篇文章主要介紹了.NET的求復雜類型集合的差集、交集、并集,下面我將帶著大家去了解如何通過微軟自帶方法方式去取**復雜類型集合**的差集、交集、并集,需要的朋友可以參考下

前言

如標題所述,在ASP.NET應用程序開發(fā)中,兩個集合做比較時 我們使用微軟IEnumerable封裝的Except/Intersect/Union取 差集/交集/并集 方法是非常的方便的;

但以上對于不太熟悉的小伙伴來講,在遇到求包含引用類型(不包含string)集合時就非常的苦惱;

下面我將帶著大家去了解如何通過微軟自帶方法方式去取**復雜類型集合**的差集、交集、并集。

場景

這里是場景,我有以下兩個學生集合。

namespace Test2
{
    internal class Program
    {
        public void Main()
        {
            //列表1
            List<Student> StudentList1 = new List<Student>()
            {
                  new Student {Id=1,Name="小明",Age=27  },
                  new Student {Id=3,Name="大郭",Age=28  },
                  new Student {Id=4,Name="老登",Age=29  }
             };
            List<Student> StudentList2 = new List<Student>()
            {
                 new Student {Id=1,Name="小明",Age=27  },
                 new Student {Id=3,Name="大郭",Age=28  },
                 new Student {Id=4,Name="老登",Age=29 },
                 new Student {Id=4,Name="小路",Age=28 },
                 new Student {Id=4,Name="小明",Age=30 }
             };
        }
    }
}

生成兩個實體集合;

下面我們取交集/差集/并集

完整調用示例(.NET Core):

namespace Test2
{
    internal class Program
    {
        public static void Main()
        {
            //列表1
            List<Student> StudentList1 = new List<Student>()
            {
                  new Student {Id=1,Name="小明",Age=27  },
                  new Student {Id=2,Name="大郭",Age=28  },
                  new Student {Id=3,Name="老登",Age=29  }
             };
            //列表2
            List<Student> StudentList2 = new List<Student>()
            {
                 new Student {Id=1,Name="小明",Age=27  },
                 new Student {Id=2,Name="大郭",Age=28  },
                 new Student {Id=3,Name="老登",Age=29 },
                 new Student {Id=4,Name="小路",Age=28 },
                 new Student {Id=5,Name="小明",Age=30 }
             };
            //取比列表1里多出來的學生數(shù)據(jù) 并輸出
            var ExceptData = StudentList2.Except(StudentList1);
            Console.WriteLine("差集:" + String.Join(";", ExceptData.Select(x => { return $"{x.Id}-{x.Name}-{x.Age}"; })));
            //取列表1與列表2里共有的學生數(shù)據(jù)
            var IntersectData = StudentList1.Intersect(StudentList2);
            Console.WriteLine("交集:" + String.Join(";", IntersectData.Select(x => { return $"{x.Id}-{x.Name}-{x.Age}"; })));
            //獲取辦理所有學生的數(shù)據(jù)(一個相同的學生只能一條)
            var UnionData = StudentList1.Union(StudentList2);
            Console.WriteLine("并集:"+String.Join(";", UnionData.Select(x => { return $"{x.Id}-{x.Name}-{x.Age}"; })));
        }
    }
}

輸出:

  差集:1-小明-27;2-大郭-28;3-老登-29;4-小路-28;5-小明-30
  交集:null
  并集:1-小明-27;2-大郭-28;3-老登-29;1-小明-27;2-大郭-28;3-老登-29;4-小路-28;5-小明-30

以上輸出仔細看一下明顯是不對的,這就涉及到了復雜類型對比,請看代碼:

正常我們聲明的類

/// <summary>
/// 學生類
/// </summary>
internal class Student
{
    /// <summary>
    /// 編號
    /// </summary>
    public int Id { get; set; }

    /// <summary>
    /// 姓名
    /// </summary>
    public string Name { get; set; }

    /// <summary>
    /// 年齡
    /// </summary>
    public int Age { get; set; }

}

因為我們要對比的是引用類型,因為在對比除string引用類型外,其他引用類型的對比默認都是對比的堆里地址,所以我們要實現(xiàn)一個自定義的對比方案

我們需要繼承一個接口IEqualityComparer<T> 泛型接口

如下:(這里我們以年齡與名做為對比條件)

/// <summary>
/// 學生類
/// </summary>
internal class Student : IEqualityComparer<Student>
{
    /// <summary>
    /// 編號
    /// </summary>
    public int Id { get; set; }

    /// <summary>
    /// 姓名
    /// </summary>
    public string Name { get; set; }

    /// <summary>
    /// 年齡
    /// </summary>
    public int Age { get; set; }

    /// <summary>
    /// 比較器
    /// </summary>
    /// <param name="s1">比較實體1</param>
    /// <param name="s2">比較實體2</param>
    /// <returns></returns>
    public bool Equals(Student s1, Student s2)
    {
        //驗證相等條件
        if (s1.Name == s2.Name && s1.Age == s2.Age)
        {
            return true;
        }
        return false;
    }

    /// <summary>
    /// 獲取唯一條件
    /// </summary>
    /// <param name="stu"></param>
    /// <returns></returns>
    public int GetHashCode(Student stu)
    {
        return (stu.Name + "|" + stu.Age).GetHashCode();
    }
}

修改了類后還有最重要的一點:就是修改比較的方法(相當于聲明一個自定義的比較器給方法)

//取比列表1里多出來的學生數(shù)據(jù) 并輸出
            var ExceptData = StudentList2.Except(StudentList1,new Student());
            Console.WriteLine("差集:" + String.Join(";", ExceptData.Select(x => { return $"{x.Id}-{x.Name}-{x.Age}"; })));

            //取列表1與列表2里共有的學生數(shù)據(jù)
            var IntersectData = StudentList1.Intersect(StudentList2,new Student());
            Console.WriteLine("交集:" + String.Join(";", IntersectData.Select(x => { return $"{x.Id}-{x.Name}-{x.Age}"; })));

            //獲取辦理所有學生的數(shù)據(jù)(一個相同的學生只能一條)
            var UnionData = StudentList1.Union(StudentList2,new Student());
            Console.WriteLine("并集:"+String.Join(";", UnionData.Select(x => { return $"{x.Id}-{x.Name}-{x.Age}"; })));

輸出:

  差集:4-小路-28;5-小明-30 

  交集:1-小明-27;2-大郭-28;3-老登-29

  并集:1-小明-27;2-大郭-28;3-老登-29;4-小路-28;5-小明-30

到這里引用類型的比較已經(jīng)完成了,比較器的條件方法可以根據(jù)需求調整,如有不足之處,希望大家多多指正!?。?/p>

到此這篇關于.NET的求復雜類型集合的差集、交集、并集的文章就介紹到這了,更多相關.net差集、交集、并集內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論

武陟县| 台南县| 安新县| 保亭| 阿拉善盟| 麟游县| 正镶白旗| 北安市| 治县。| 贺兰县| 长宁区| 莲花县| 六盘水市| 西盟| 武邑县| 锡林浩特市| 石楼县| 牡丹江市| 祁阳县| 巴塘县| 新安县| 黄冈市| 水富县| 延川县| 嘉义县| 津市市| 宁波市| 泽州县| 苗栗市| 高唐县| 佳木斯市| 惠水县| 武汉市| 邻水| 崇阳县| 新源县| 甘洛县| 岫岩| 乐昌市| 黑龙江省| 衡水市|