是通用列表与众不同

Pas*_*cal 3 c# linq

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

enum MaterialType
{
   Iron,
   Plastic,
   Carbon,
   Wood
}
Run Code Online (Sandbox Code Playgroud)

我有一个材料项目列表.

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},
}
Run Code Online (Sandbox Code Playgroud)

每种类型在材料清单中应该只有一次可用的最大值.

我怎么写这个:

bool isItemsListDistinct =材料.??

上述样本至少有一个副本,即"Iron",因此返回值必须为false.

Dmi*_*nko 5

像这样的东西(Linq):

bool isItemsListDistinct = !materials
  .GroupBy(item => item)
  .Any(chunk => chunk.Skip(1).Any());
Run Code Online (Sandbox Code Playgroud)

说明:chunk.Count() > 1可能带来开销(想象Count()返回1234567,内部表示是一个链表),所以安全方式是检查第一个之后是否有项目:chunk.Skip(1).Any().

编辑:即使目前实施GroupBy()的LINQ到对象没有问题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; }
    }
    ...
  }
Run Code Online (Sandbox Code Playgroud)

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