4

次のコードを検討してください。

class Employee : IComparable<Employee>
{
    public string Name { get; set; }

    public int CompareTo(Employee other)
    {
        return string.Compare(this.Name, other.Name);
    }
}

void DoStuff()
{
    var e1 = new Employee() { Name = "Frank" };
    var e2 = new Employee() { Name = "Rizzo" };

    var lst = new List<Employee>() { e1, e2 };
    lst.Sort();
}

Sortメソッドが実際に何かを再配置したかどうかを知るにはどうすればよいですか?ボーナスの質問:それが再配置された場合、いくつのものがありますか?

4

3 に答える 3

4

http://msdn.microsoft.com/en-us/library/bb348567.aspxから取得ただし、リストを並べ替えて比較する前に、リストのコピーを作成する必要があります。

List<Pet> pets1 = new List<Pet> { pet1, pet2 };
List<Pet> pets2 = new List<Pet> { pet1, pet2 };

bool equal = pets1.SequenceEqual(pets2);
于 2013-03-01T23:04:31.307 に答える
3

独自の比較機能を実装したので、呼び出された回数を追跡してみませんか?

// naive, not thread safe, not exactly going to tell you much
static int compared = 0;
public int CompareTo(Employee other)
{
    compared++;
    return string.Compare(this.Name, other.Name);
}

別のアプローチとして、リスト全体を毎回ソートするのではなく、ソートされた入力に切り替えてみませんか?

public void AddEmployee(Employee item)
{
    // keep in mind this may not always be faster than List<T>.Sort
    // but it should be.
    if (employees.Count > 1)
    {
        var index = employees.BinarySearch(item);
        if (index < 0)
        {
            employees.Insert(~index, item);
        }
    }
    else employees.Add(item);
}

または、のような並べ替えられたコレクションを使用しますSortedList<K,T>

于 2013-03-01T23:11:29.547 に答える
2

それは最も良い解決策として聞こえないかもしれませんが、なぜの結果をログに記録しませんかstring.Compare

public int CompareTo(Employee other)
{
    int result = string.Compare(this.Name, other.Name);

    Debug.WriteLine("Result of Compare of {0} and {1} is {2}", 
        this.Name, other.Name, result);

    return result;
}
于 2013-03-01T23:08:47.873 に答える