gpt4 book ai didi

c# - 是通用列表独特的

转载 作者:行者123 更新时间:2023-11-30 13:30:36 25 4
gpt4 key购买 nike

public Material
{
public MaterialType MaterialKind {get;set;}
}

enum MaterialType
{
Iron,
Plastic,
Carbon,
Wood
}

我有一份 Material list 。

var items = new List<Material>
{
new Material{ MaterialKind = MaterialType.Iron},
new Material{ MaterialKind = MaterialType.Plastic},
new Material{ MaterialKind = MaterialType.Carbon},
new Material{ MaterialKind = MaterialType.Iron},
new Material{ MaterialKind = MaterialType.Wood},
}

每种类型在 Material 列表中最多只能使用一次。

我该怎么写:

bool isItemsListDistinct = materials.??

上面的示例至少有一个重复项是“Iron”,因此返回值必须为 false。

最佳答案

像这样的东西(Linq):

bool isItemsListDistinct = !materials
.GroupBy(item => item)
.Any(chunk => chunk.Skip(1).Any());

解释:chunk.Count() > 1 可能带来开销(假设Count() 返回1234567 并且内部表示是一个链表),所以更安全的方法是检查第一个之后是否有一个项目:chunk.Skip(1).Any().

编辑:即使 Linq to ObjectsGroupBy() 的当前实现没有 Count() 问题:

http://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs,7bb231e0604c79e3

  internal class Grouping : IGrouping<TKey, TElement>, IList<TElement> {
...
internal int count;
...
// No overhead in such implementation
int ICollection<TElement>.Count {
get { return count; }
}
...
}

使用 Any()Exists(在 SQL 中)等而不是 Count() 当集合是/(可以)依赖时关于实现是一个很好的做法。

关于c# - 是通用列表独特的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31791642/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com