14

所以说我有一个有一个属性的班级学生,int Age。现在如果我有List<Student> students,我如何检查列表中所有学生的年龄是否相等?

4

6 回答 6

31

您可以通过 usingAll方法检查,想必您的列表中有学生:

var firstStudent = students.First();
students.All(s => s.Age == firstStudent.Age);
于 2013-08-28T11:23:16.237 回答
11

如果您想在一个查询中执行此操作,而不是两个(这通常是不好的做法),

bool allAgesAreTheSame = (students.Select(s => s.Age).Distinct().Count() < 2);

会为你做的。

在根本没有学生的情况下,这也将返回 true,而不是抛出异常。(您可以做== 1而不是< 2在微不足道的情况下返回 false 。)

于 2013-08-28T11:30:57.963 回答
4

只是一个随机的答案-不确定我是否会在现实中这样做,但这将非常有效:

  • 如果鸭子类型可用,将使用类型化迭代器(不像 LINQ,它不会) - 并注意List<T> 确实提供了鸭子类型的迭代器
  • 没有双重迭代
  • 空序列没有失败等
  • 没有代表、捕获上下文等
  • ETC

代码:

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;
}
于 2013-08-28T11:35:28.330 回答
3

如果学生可以有 0 个元素,您可以这样做:

var firstStudent = students.FirstOrDefault();
var areSame =students.All(s => s.Age == firstStudent.Age);
于 2013-08-28T11:37:35.797 回答
0

如果你不能使用 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;
}
于 2013-08-28T11:35:47.953 回答
0

如果您只需检查一次,标记的答案是最佳解决方案。要在代码中多次使用它,只需编写一个静态扩展来检查属性的相等性:

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);
}

但是使用此代码,您必须检查天气返回值是否nulldefault(TKey)属性类型相关。

于 2015-01-28T10:14:48.710 回答