2009-04-16 10 views
2

ラムダ式を書いてリストの順序が正しいことを確認したい。ラムダ式が正しくリストされていることを確認する

IList<Person> people = new List<Person>(); 
people.Add(new Person(){ Name = "Alan"}); 
people.Add(new Person(){ Name = "Bob"}); 
people.Add(new Person(){ Name = "Chris"}); 

私はリストは私が

Assert.That(people.All(....), "list of person not ordered correctly"); 
のようなものの後だ名前property.SoによってASCを命じていることをテストしようとしている:私は、人はNameプロパティの例を持っているリストを持っています

ラムダを書いて、リスト内の各Personの名前がリスト内の次の人の名前よりも小さいことを確認するにはどうすればよいですか?

+6

簡単なヒント - オブジェクト初期化子でパラメータのないコンストラクタを使用している場合、()は必要ありません。たとえば、people.Add(新しいPerson {Name = "Alan"}); –

答えて

5

はここでジャレッドのソリューションに代わるものだ - それはほとんど同じですが、かどうかをチェックするためにforeachループやブール変数を使用してまたはこれが最初の反復ではない。

public static bool IsOrdered<T>(this IEnumerable<T> source) 
{ 
    var comparer = Comparer<T>.Default; 
    T previous = default(T); 
    bool first = true; 

    foreach (T element in source) 
    { 
     if (!first && comparer.Compare(previous, element) > 0) 
     { 
      return false; 
     } 
     first = false; 
     previous = element; 
    } 
    return true; 
} 
4

現在、このケースをカバーするLINQ演算子はありません。しかし、あなたは仕事をするIsOrderedメソッドを書くことができます。例えば。

public static bool IsOrdered<T>(this IEnumerable<T> enumerable) { 
    var comparer = Comparer<T>.Default; 
    using (var e = enumerable.GetEnumerator()) { 
    if (!e.MoveNext()) { 
     return true; 
    } 
    var previous = e.Current; 
    while (e.MoveNext()) { 
     if (comparer.Compare(previous, e.Current) > 0) { 
     return false; 
     } 
     previous = e.Current; 
    } 
    return true; 
    } 
} 

次に、あなたがあなたのリストを確認するには、次の使用することができます

var isOrdered = people.Select(x => x.Name).IsOrdered(); 
0

私はこれが古い質問ですけど、私は、この使用してLINQのための非常に良い解決策があります:基本的に

people.Zip(people.OrderBy(p => p.Name), (a, b) => a == b).All(eq => eq); 

は、あなたが列をマージしている私は通常、手動で反復処理よりもその簡単に見つけます順序付けられたシーケンスで、そして両方のエントリが等しいかどうかを示すブール値を投影:

"Alan" -- "Alan" => true 
"Bob" -- "Bob" => true 
"Chris" -- "Chris" => true 

次に、あなたが尋ねるAll方法ですべての項目場合コレクションの中にはtrueがあります。

0

何について:あなたは重複しない確認したい場合は

people.SequenceEqual(people.OrderBy(x=>x.Name)); 

SequenceEqualは())のOrderBy(後)(あなたが個別に追加することができます3.5 以来利用されています。

関連する問題