.NET[C#]使用LINQ从List<T>集合中删除重复对象元素(去重)的方法有哪些?

.NET 作者: Rector 1009阅读 1评论 0收藏 收藏本文 编辑

郑重申明:本文未经许可,禁止任何形式转载

.NET[C#]使用LINQ从List<T>集合中删除重复对象元素(去重)的方法有哪些?

问题描述

比如有如下的List集合:

1         Item1       IT00001        $100
2         Item2       IT00002        $200
3         Item3       IT00003        $150
1         Item1       IT00001        $100
3         Item3       IT00003        $150

使用LINQ如何实现对以上List集合的去重操作,具体实现有哪些呢?

方案一

var distinctItems = items.Distinct();

如果需要对泛型实体中的部分属性进行去重操作,则可以创建一个自定义的比较器:

class DistinctItemComparer : IEqualityComparer<Item> {

    public bool Equals(Item x, Item y) {
        return x.Id == y.Id &&
            x.Name == y.Name &&
            x.Code == y.Code &&
            x.Price == y.Price;
    }

    public int GetHashCode(Item obj) {
        return obj.Id.GetHashCode() ^
            obj.Name.GetHashCode() ^
            obj.Code.GetHashCode() ^
            obj.Price.GetHashCode();
    }
}

调用方法:

var distinctItems = items.Distinct(new DistinctItemComparer());

方案二

var distinctItems = items.GroupBy(x => x.Id).Select(y => y.First());

方案三

使用 MoreLinq 组件:

var distinct = items.DistinctBy( i => i.Id );

方案四

var query = collection.GroupBy(x => x.title).Select(y => y.FirstOrDefault());

方案五

创建静态扩展方法,如:

public static class DistinctHelper
{
    public static IEnumerable<TSource> DistinctBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
    {
        var identifiedKeys = new HashSet<TKey>();
        return source.Where(element => identifiedKeys.Add(keySelector(element)));
    }
}

调用方法:

var outputList = sourceList.DistinctBy(x => x.TargetProperty);

其中 x.TargetProperty 请替换成类对应的属性。

示例程序:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var people = new List<Person>
            {
                new Person {Id=1,Name="Curry",Age=26 },
                new Person {Id=1,Name="Curry",Age=26 },
                new Person {Id=3,Name="James",Age=27 },
                new Person {Id=4,Name="Kobe",Age=38 }
            };
            var distinctPeople = people.DistinctBy(x => x.Name).ToList();
            distinctPeople.ForEach(x =>
            Console.WriteLine($"Id:{x.Id},Name:{x.Name},Age:{x.Age}")
            );
            Console.ReadKey();
        }
    }

    public class Person
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
    }

    public static class DistinctHelper
    {
        public static IEnumerable<TSource> DistinctBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
        {
            var identifiedKeys = new HashSet<TKey>();
            return source.Where(element => identifiedKeys.Add(keySelector(element)));
        }
    }
}

方案六

public static class DistinctHelper
    {
        public static IEnumerable<TSource> DistinctBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
        {
            var identifiedKeys = new HashSet<TKey>();

            foreach (var item in source)
            {
                if (identifiedKeys.Add(keySelector(item)))
                    yield return item;
            }
        }
    }

阅读了该文章的人还浏览了...

本文永久链接码友网 » .NET[C#]使用LINQ从List<T>集合中删除重复对象元素(去重)的方法有哪些?

发布于: 2018-01-15 10:55:00
分享扩散: