.Net_列表去重的方法

方法一:遍历list

循环遍历List,借助Dictionary存储去重的对象

Dictionary<string, Item> result = new Dictionary<string, Item>();
foreach (Item item in list)//list为待去重列表
{
    Item temp;
    if (!result.TryGetValue(item.name, out temp))
    {
        result.Add(item.name, item);
    }
}
List<Item> result_list = result.Values.ToList();



///Item
public class Item
{
    public string name { get; set; }
    public string value { get; set; }
}

方法二:ToLookup

利用ToLookup查找,并转为Dictionary

List<Item> result = list.ToLookup(item => item.name).ToDictionary(item => item.Key, item => item.First()).Values.ToList();


///Item
public class Item
{
    public string name { get; set; }
    public string value { get; set; }
}

方法三:自定义Compare

自定义Compare方法实现

List<Item> result = list.Distinct(new Compare()).ToList();



//compare方法
public class Compare : IEqualityComparer<Item>
{
    public bool Equals(Item a, Item b)
    {
        return a.name == b.name;
    }

    public int GetHashCode(Item obj)
    {
        return obj.name.GetHashCode();
    }
}

///Item
public class Item
{
    public string name { get; set; }
    public string value { get; set; }
}

Compare公用方法

public class Compare<T, C> : IEqualityComparer<T>
{
    private Func<T, C> _getField;
    public Compare(Func<T, C> getfield)
    {
        this._getField = getfield;
    }
    public bool Equals(T x, T y)
    {
        return EqualityComparer<C>.Default.Equals(_getField(x), _getField(y));
    }
    public int GetHashCode(T obj)
    {
        return EqualityComparer<C>.Default.GetHashCode(this._getField(obj));
    }
}
public static class CommonHelper
{
    /// <summary>
    /// 自定义Distinct扩展方法
    /// </summary>
    /// <typeparam name="T">要去重的对象类</typeparam>
    /// <typeparam name="C">自定义去重的字段类型</typeparam>
    /// <param name="source">要去重的对象</param>
    /// <param name="getfield">获取自定义去重字段的委托</param>
    /// <returns></returns>
    public static IEnumerable<T> MyDistinct<T, C>(this IEnumerable<T> source, Func<T, C> getfield)
    {
        return source.Distinct(new Compare<T, C>(getfield));
    }
}


//调用
list.MyDistinct(s=>s.Id).ToList().ForEach(s => Console.WriteLine(s.ToString()));

方法四:groupby

利用GroupBy分组实现

List<Item> result = list.GroupBy(item => item.name).Select(item => item.First()).ToList();

///Item
public class Item
{
    public string name { get; set; }
    public string value { get; set; }
}

总结

方法一和方法三去重效率差不多,方法二和方法四去重效率差不多,但是方法一和方法三的效率是方法二和方法四的四倍左右,所以推荐使用方法三。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值