检查集合中的所有项目是否具有相同的值

Cas*_*jne 10 c# linq arrays extension-methods

名为MeasurementCollection的集合上的扩展方法检查每个项的属性Template.Frequency(Enum)是否具有相同的值.

public static bool IsQuantized(this MeasurementCollection items)
{
    return  (from i in items 
             select i.Template.Frequency)
            .Distinct()
            .Count() == 1;
}
Run Code Online (Sandbox Code Playgroud)

编辑 有关基础类的信息

MeasurementCollection : ICollection<IMeasurement>

IMeasurement 
{
    IMeasurementTemplate Template { get; }        
    ......
}
Run Code Online (Sandbox Code Playgroud)

这是一个正确的方法还是已经在Linq中有一个更简单的解决方案?该方法将在应用中得到广泛应用.

你有提示带我回到绘图板吗?

Chr*_*oph 9

您可以找到第一个值并检查是否有其他值不同,这将避免必须评估整个集合(除非单个不同的值是最后一个)

public static bool IsQuantized(this MeasurementCollection items)
{
    if(!items.Any())
        return false; //or true depending on your use case

    //might want to check that Template is not null, a bit a violation of level of demeter, but just an example
    var firstProp = items.First().Template.Frequency;

    return !items.Any(x=> x.Template.Frequency != firstProp);

}
Run Code Online (Sandbox Code Playgroud)


Hen*_*man 8

编辑:解决Timwi对3名调查员的担忧:

bool same = <your default> ;
var first = items.FirstOrDefault();
if (first != null)  // assuming it's a class
{
   same = items.Skip(1).All(i => i.Template.Frequency == first.Template.Frequency); 
}
Run Code Online (Sandbox Code Playgroud)

其中仍然使用2个枚举器.对于平均值来说不是问题List<>,但对于数据库查询,使用可读性较低的问题可能会付出代价:

bool same = <your default> ;
Item first = null;

foreach(var item in items)
{
    if (first == null)
    {
        first = item;
        same = true;
    }
    else
    {
        if (item.Template.Frequency != first.Template.Frequency)
        {
           same = false;
           break;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @Timwi但从好的方面来看,这种方法更具可读性,因为它可以编写,因此它几乎可以作为要求读取 (2认同)