如何检查每个列表成员的属性值是否相同
本文关键字:属性 成员 是否 列表 何检查 检查 | 更新日期: 2023-09-27 18:29:23
假设我有一个类Student,它有一个属性int Age
。现在,如果我有List<Student> students
,我该如何检查列表中所有学生的年龄是否相等?
您可以使用All
方法进行检查,假设您的列表中有学生:
var firstStudent = students.First();
students.All(s => s.Age == firstStudent.Age);
如果您想在一个查询中执行此操作,而不是在两个查询中(这通常是不好的做法),
bool allAgesAreTheSame = (students.Select(s => s.Age).Distinct().Count() < 2);
会为你做的。
在根本没有学生的琐碎情况下,这也将返回true,而不是抛出异常。(在琐碎的情况下,可以使用== 1
而不是< 2
来返回false。)
只是一个随机答案-不确定我在现实中会这样做,但这将非常有效:
- 如果duck类型可用,将使用类型化迭代器(与LINQ不同,LINQ不会)-请注意,
List<T>
确实提供duck类型迭代器 - 没有双重迭代
- 空序列无故障等
- 没有委托、捕获上下文等
- 等等
代码:
using(var iter = students.GetEnumerator()) // a List<T>.Enumerator struct
{
if(!iter.MoveNext()) return true; // or false, as you define for "empty"
int age = iter.Current.Age;
while(iter.MoveNext())
if(iter.Current.Age != age)
return false;
return true;
}
如果学生可以有0个元素,你可以这样做:
var firstStudent = students.FirstOrDefault();
var areSame =students.All(s => s.Age == firstStudent.Age);
如果你不能使用linq,你可以一直循环所有的学生:
private bool sameAge (List<Student> students)
{
int auxAge = students.Count > 0? students[0].Age : 0;
foreach (Student stu in students)
{
if (stu.Age != auxAge)
return false;
}
return true;
}
如果只需要检查一次,则标记的ansare是最佳解决方案。要在代码中多次使用它,只需编写一个静态扩展来检查属性的相等性:
public static bool GetIdenticProperty<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> predicate)
{
IEnumerable<TSource> enumerable = source as IList<TSource> ?? source.ToList();
if ((!enumerable.Any()) || (enumerable.Count() == 1))
return true; // or false if you prefere
var firstItem = enumerable.First();
bool allSame = enumerable.All(i => Equals(predicate(i), predicate(firstItem)));
return allSame;
}
如果你想稍后使用属性的值,让我们返回该值:
public static TKey GetIdenticProperty<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> predicate)
{
IEnumerable<TSource> enumerable = source as IList<TSource> ?? source.ToList();
if (!enumerable.Any())
return default(TKey);
var firstItem = enumerable.First();
bool allSame = enumerable.All(i => Equals(predicate(i), predicate(firstItem)));
return allSame ? predicate(firstItem) : default(TKey);
}
但使用此代码,您必须检查返回的值是与属性类型相关的null
还是default(TKey)
。