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