我在C#中有一个列表:
var list = new List<Car>();
list.AddRange(GetGreenCars());
list.AddRange(GetBigCars());
list.AddRange(GetSmallCars());问题是,一些相同的汽车会在不同的函数中返回,我不希望它们多次出现在列表中。每辆车都有一个唯一的Name属性。有没有什么办法,我可以有类似上面的东西,但只会添加项目,如果他们是唯一的?
发布于 2015-10-05 11:46:24
我创建了一个扩展方法,该方法只向从IEnumerable<T>实现ICollection<T> (包括List<T>)的任何内容添加唯一值。与使用List<T>.Contains()的实现不同,此方法允许您指定一个λ表达式来确定两个项是否相同。
/// <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);
}
}用法:
source.AddUniqueBy<Foo>((s, i) => s.Id == i.Id, items);https://stackoverflow.com/questions/8652340
复制相似问题