如何检查所有列表项是否具有相同的值并将其返回,如果不是,则返回“otherValue”?

时间:2010-12-08 17:29:21

标签: c# linq

如果列表中的所有项都具有相同的值,那么我需要使用该值,否则我需要使用“otherValue”。我想不出一个简单明了的做法。

另见Neat way to write loop that has special logic for the first item in a collection.

9 个答案:

答案 0 :(得分:137)

var val = yyy.First().Value;
return yyy.All(x=>x.Value == val) ? val : otherValue; 

我能想到的最干净的方式。您可以通过内联val使其成为单行,但First()将被评估n次,使执行时间加倍。

要合并评论中指定的“空集”行为,您只需在上述两个行之前再添加一行:

if(yyy == null || !yyy.Any()) return otherValue;

答案 1 :(得分:86)

所有平等的快速测试:

collection.Distinct().Count() == 1

答案 2 :(得分:20)

答案 3 :(得分:12)

return collection.All(i => i == collection.First())) 
    ? collection.First() : otherValue;.

或者如果您担心为每个元素执行First()(这可能是一个有效的性能问题):

var first = collection.First();
return collection.All(i => i == first) ? first : otherValue;

答案 4 :(得分:3)

这可能会迟到,但根据Eric的回答,这个扩展适用于价值和参考类型:

public static partial class Extensions
{
    public static Nullable<T> Unanimous<T>(this IEnumerable<Nullable<T>> sequence, Nullable<T> other, IEqualityComparer comparer = null)  where T : struct, IComparable
    {
        object first = null;
        foreach(var item in sequence)
        {
            if (first == null)
                first = item;
            else if (comparer != null && !comparer.Equals(first, item))
                return other;
            else if (!first.Equals(item))
                return other;
        }
        return (Nullable<T>)first ?? other;
    }

    public static T Unanimous<T>(this IEnumerable<T> sequence, T other, IEqualityComparer comparer = null)  where T : class, IComparable
    {
        object first = null;
        foreach(var item in sequence)
        {
            if (first == null)
                first = item;
            else if (comparer != null && !comparer.Equals(first, item))
                return other;
            else if (!first.Equals(item))
                return other;
        }
        return (T)first ?? other;
    }
}

答案 5 :(得分:1)

public int GetResult(List<int> list){
int first = list.First();
return list.All(x => x == first) ? first : SOME_OTHER_VALUE;
}

答案 6 :(得分:1)

使用LINQ的替代方法:

var set = new HashSet<int>(values);
return (1 == set.Count) ? values.First() : otherValue;

我发现使用HashSet<T>对于最多约6,000个整数的列表更快:

var value1 = items.First();
return values.All(v => v == value1) ? value1: otherValue;

答案 7 :(得分:1)

上述简化方法略有不同。

var result = yyy.Distinct().Count() == yyy.Count();

答案 8 :(得分:-1)

如果一个数组类型为multidimension,那么我们必须在linq下面写一下来检查数据。

示例:此处元素为0,我检查所有值是否为0 IP1 =
        0 0 0 0
        0 0 0 0
        0 0 0 0
        0 0 0 0

    var value=ip1[0][0];  //got the first index value
    var equalValue = ip1.Any(x=>x.Any(xy=>xy.Equals()));  //check with all elements value 
    if(equalValue)//returns true or false  
    {  
    return "Same Numbers";  
    }else{  
    return "Different Numbers";   
    }