首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
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

回答 9

Stack Overflow用户

回答已采纳

发布于 2011-12-28 13:52:35

在这里,List<T>似乎不是合适的集合。您可能需要像HashSet这样的ISet<T>实现(如果需要排序,则可以使用SortedSet )。

要实现这一点,您需要编写一个根据Name属性定义汽车之间相等的IEqualityComparer<T>实现。如果这是汽车相等的“规范”定义,您也可以考虑直接将此定义构建到Car类型本身中(object.Equalsobject.GetHashCode,理想情况下也可以实现IEquatable<T> )。

票数 22
EN

Stack Overflow用户

发布于 2011-12-28 13:51:57

一种选择是添加它们并删除重复的:

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

Stack Overflow用户

发布于 2011-12-28 13:55:49

另一种选择是做一些类似的事情:

代码语言:javascript
复制
public static void AddUnique<T>( this IList<T> self, IEnumerable<T> items )
{
    foreach(var item in items)
        if(!self.Contains(item))
            self.Add(item);
}


var list = new List<Car>();
list.AddUnique(GetGreenCars());
list.AddUnique(GetBigCars());
list.AddUnique(GetSmallCars());
票数 30
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8652340

复制
相关文章

相似问题

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