首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对于C#中的列表,是否有类似于Addrange()的AddUnique方法

对于C#中的列表,是否有类似于Addrange()的AddUnique方法
EN

Stack Overflow用户
提问于 2011-12-28 13:49:42
回答 9查看 44.4K关注 0票数 35

我在C#中有一个列表:

代码语言:javascript
复制
       var list = new List<Car>();
       list.AddRange(GetGreenCars());
       list.AddRange(GetBigCars());
       list.AddRange(GetSmallCars());

问题是,一些相同的汽车会在不同的函数中返回,我不希望它们多次出现在列表中。每辆车都有一个唯一的Name属性。有没有什么办法,我可以有类似上面的东西,但只会添加项目,如果他们是唯一的?

EN

Stack Overflow用户

发布于 2015-10-05 11:46:24

我创建了一个扩展方法,该方法只向从IEnumerable<T>实现ICollection<T> (包括List<T>)的任何内容添加唯一值。与使用List<T>.Contains()的实现不同,此方法允许您指定一个λ表达式来确定两个项是否相同。

代码语言:javascript
复制
/// <summary>
/// Adds only items that do not exist in source.  May be very slow for large collections and some types of source.
/// </summary>
/// <typeparam name="T">Type in the collection.</typeparam>
/// <param name="source">Source collection</param>
/// <param name="predicate">Predicate to determine whether a new item is already in source.</param>
/// <param name="items">New items.</param>
public static void AddUniqueBy<T>(this ICollection<T> source, Func<T, T, bool> predicate, IEnumerable<T> items)
{
    foreach (T item in items)
    {
        bool existsInSource = source.Where(s => predicate(s, item)).Any();
        if (!existsInSource) source.Add(item);
    }
}

用法:

代码语言:javascript
复制
source.AddUniqueBy<Foo>((s, i) => s.Id == i.Id, items);
票数 5
EN
查看全部 9 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8652340

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档