使用LINQ或其他方法,如何检查所有列表项是否具有相同的值并将其返回,如果不是则返回“otherValue”?
如果列表中的所有项目都具有相同的值,则需要使用该值,否则我需要使用“otherValue”。 我想不出一个简单明了的做法。
另请参阅用于编写集合中第一个项目具有特殊逻辑的循环的整洁方式。
var val = yyy.First().Value; return yyy.All(x=>x.Value == val) ? val : otherValue;
我能想到的最干净的方式。 您可以通过内联val来使其成为一行,但First()将被评估n次,使执行时间加倍。
为了结合注释中指定的“空集”行为,只需在上面两行之前再添加一行即可:
if(yyy == null || !yyy.Any()) return otherValue;
好的快速testing所有平等:
collection.Distinct().Count() == 1
虽然你当然可以用现有的序列操作符来创build这样一个设备,但在这种情况下,我倾向于把它作为一个自定义序列操作符来编写。 就像是:
// Returns "other" if the list is empty. // Returns "other" if the list is non-empty and there are two different elements. // Returns the element of the list if it is non-empty and all elements are the same. public static int Unanimous(this IEnumerable<int> sequence, int other) { int? first = null; foreach(var item in sequence) { if (first == null) first = item; else if (first.Value != item) return other; } return first ?? other; }
这很简短,涵盖了所有情况,并且不会不必要地创build序列的额外迭代。
将其作为一个在IEnumerable<T>
上工作的generics方法IEnumerable<T>
练习。 🙂
return collection.All(i => i == collection.First())) ? collection.First() : otherValue;.
或者如果你担心为每个元素执行First()(这可能是一个有效的性能问题):
var first = collection.First(); return collection.All(i => i == first) ? first : otherValue;
public int GetResult(List<int> list){ int first = list.First(); return list.All(x => x == first) ? first : SOME_OTHER_VALUE; }
这可能是迟到的,但基于埃里克的回答,这是一个适用于价值和参考types的扩展:
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; } }
使用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;
上述简化方法略有差异。
var result = yyy.Distinct().Count() == yyy.Count();
如果一个数组的types如下所示,那么我们必须写下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"; }