如果列表中的所有项都具有相同的值,那么我需要使用该值,否则我需要使用“otherValue”。我想不出一个简单明了的做法。
另见Neat way to write loop that has special logic for the first item in a collection.
答案 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";
}