2017-02-10 15 views
2

たとえば、List{1,2,3,4,5}が含まれている場合は、Sort()を呼び出しても何も変更されません。しかし、リストに{1,2,4,3,5}が含まれている場合は、Sort()を呼び出して注文を変更します。List.Sort()を呼び出した後に注文が変更されるかどうかを確認しますか?

Sort()に何か変更があったかどうかを知る方法はありますか?このメソッドはvoidを返します。

P.S. 実際、私はこの質問を投稿する前にこれをテストしました。考えられるのは、xが現在yの前の項目であるため、負の値を返す必要がある場合は、スワップが発生します。残念ながら、それは動作しませんでした...しかし、なぜですか?

class IntComp : IComparer<int> 
{ 
    public int Compare(int x, int y) 
    { 
     var result = x - y; 
     if (result < 0) 
      _IsChanged = true; 
     return result; 
    } 

    private bool _IsChanged = false; 
    public bool IsChanged() 
    { 
     var result = _IsChanged; 
     _IsChanged = false; 
     return result; 
    } 
} 

var list = new List<int>() {}; 
Random r = new Random(); 
for (int i = 0; i < 1000; i++) 
{ 
    list.Add(r.Next()); 
} 

var comparer = new IntComp(); 
Stopwatch w = new Stopwatch(); 
w.Start(); 
list.Sort(comparer); 
w.Stop(); 
Debug.WriteLine(comparer.IsChanged() + ", " + w.Elapsed); 
w.Restart(); 
list.Sort(comparer); 
w.Stop(); 
Debug.WriteLine(comparer.IsChanged() + ", " + w.Elapsed); 
+3

私は知りたいと思っています...なぜ知りたいですか? – peval27

+0

注文が変更されていない場合は、UIを更新する必要はありません。 –

+3

次にソートする前にソートされているかどうかを検出することを示唆する答えに従ってください。 –

答えて

9

元のリストとソート済みのリストを比較してみませんか?

var tmp = new List<MyType>(myList); 
list.Sort(); 

if(tmp.SequenceEquals(list)) 
{ 
    // both lists are equals so your list wasn´t modified by Sort 
} 

SequenceEqualsあなたの二つのリストが正確に同じ順序で同じ要素を持っているかどうかを確認します。

編集:あなたのリストを繰り返して、すべての要素が祖先よりも大きいかどうかを確認する簡単な方法を書くこともできます。これは絶食方法であるべきであり、不必要な反復回数とあなたのリストのコピーを回避:

public bool IsOrdered<T>(this IEnumerable<T> src) where T: IComparable 
{ 
    for(int i = 1; i < myList.Count; i++) 
    { 
     if(myList[i - 1].CompareTo(myList[i]) == 1) return false; 
    } 
    return true; 
} 
+0

これは効率的な方法があることを期待していました。これには、新しいリストとO(n)比較を作成する必要があります。内部的には、スワッピングが発生するポイントが存在しなければならず、Sort()はそれを監視し、何かをchagedしたかどうかを知る方法を提供することができます。しかし、そのようなことはないように思われるので、私はこのように行きます。 –

+3

@DamnVegetables実際に問題を解決するには、この回答を読んでください。 – Servy

6

あなたはメモリ内だけのオリジナルのリストを保持したい場合は、あなたが何ができるかが最初にチェックされた最初の場所で、リストis sortedか。そうであれば、並べ替えの必要がないので変更されません。ソートされていない場合は、ソートして、変更されたことを確認することができます。

これで、後で比較するために使用されるリストのクローンを作成する必要がないため、メモリが節約されます。

+2

リストがソートされているかどうかをチェックする*ので、リストを完全に反復してソートするので、メモリが得られません。 – HimBromBeere

+0

@Franこの例では、IsOrdered関数は1つのリストのみを取ります。あなたは2つを必要としません... –

+3

@Franあなたは他のリストとリストを比較しません。リスト内の項目を互いに比較します。答えは、決して答えを得るためのリンクをたどる必要もありません。それはリンクだけの答えがその顔に不合理であると言っている。その答えには、リンクを越えて明確な内容があります。 – Servy

関連する問題