14

たとえば、1 つのプロパティを持つクラス Student があるとしますint Age。を持っているList<Student> students場合、リスト内のすべての学生の年齢が等しいかどうかを確認するにはどうすればよいですか?

4

6 に答える 6

31

メソッドを使用して確認できAllます。おそらくリストには学生がいます:

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

これを 2 つではなく 1 つのクエリで実行したい場合 (これは一般的に悪い習慣です)、

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

あなたのためにそれをします。

これは、例外をスローするのではなく、生徒がまったくいないという些細なケースでも true を返します。(代わりに、些細なケースで false を返すのでは== 1なく、そうすることができます。)< 2

于 2013-08-28T11:30:57.963 に答える
4

ただのランダムな答え - 実際にこのようにするかどうかはわかりませんが、これは非常に効率的です:

  • ダックタイピングが利用可能な場合は、型指定されたイテレータを使用します (使用しない LINQ とは異なります) -ダックタイプのイテレータList<T> 提供されていることに注意してください
  • 二重反復なし
  • 空のシーケンスの失敗などはありません
  • デリゲート、キャプチャ コンテキストなどはありません

コード:

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 に答える
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);
}

ただし、このコードを使用して、戻り値がプロパティのタイプに関連しているnullかどうかを確認する必要があります。default(TKey)

于 2015-01-28T10:14:48.710 に答える
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 に答える