使用LINQ </t?>检查IEnumerable <t?>的所有项是否具有相同的值

时间:2010-12-04 17:48:48

标签: c# linq .net-3.5 ienumerable

我有一个可以为空的类型,例如SomeEnum?和一组值,例如IEnumerable<SomeEnum?>

如何使用LINQ检查所有项目是否具有相同的值(并获取此值)?

4 个答案:

答案 0 :(得分:15)

data.Distinct().Count() == 1;

效果也不错。

答案 1 :(得分:9)

public static bool AllEqual<T>(this IEnumerable<T?> values) where T : struct
{
        if (!values.Any()) return true;
        T? first = values.First();
        return values.Skip(1).All(v => first.Equals(v));
}

编辑:要获得该值,您可以返回一个元组(成功,值),如下所示:

public Tuple<bool, T?> AllEqual<T>(IEnumerable<T?> values) where T : struct
{
    if(! values.Any()) return Tuple.Create(true, (T?)null);
    T? first = values.First();
    bool equal = values.Skip(1).All(v => v.Equals(first));
    return Tuple.Create(equal, equal ? first : (T?)null);
}

或者您可以使用out参数:

public static bool AllEqual<T>(this IEnumerable<T?> values, out T? value) where T : struct
{
    value = null;
    if (!values.Any()) return true;

    T? first = values.First();
    value = first;

    return values.Skip(1).All(v => first.Equals(v));
}

答案 2 :(得分:5)

var value = data.Distinct().Single();

(如果没有一个唯一值,则抛出异常,否则返回该值)

如果您不想要例外:

var few=data.Distinct().Take(2).ToList();
if(few.Count==1) {
    var value = few[0];
    ...
}

答案 3 :(得分:3)

Lazy并为空序列返回true:

public function actionIndex($productcustomurl)
{
     //Now, you can find a product by its custom url, and pass the finded product object to the view
}