5

私の質問はIComparerインターフェイスに関するものです。これまでに使用したことがないので、すべてを正しく設定するのを手伝っていただければ幸いです。

インターフェイスを使用して、自分のオブジェクトのリストを別のオブジェクトの正確な順序で並べ替える必要がありますList<int>。ネット上でその問題に役立つものは何も見つかりませんでした。見つけたものはすべて、使用できないlinqステートメントでした。

コード例は次のとおりです。

public class What : IComparer<What>
{
    public int ID { get; set; }
    public string Ever { get; set; }

    public What(int x_ID, string x_Ever)
    {
        ID = x_ID;
        Ever = x_Ever;
    }

    public int Compare(What x, What y)
    {
        return x.ID.CompareTo(y.ID);
    }
}

操作するデータ:

List<What> WhatList = new List<What>()
{
    new What(4, "there"),
    new What(7, "are"), 
    new What(2, "doing"),
    new What(12, "you"),
    new What(78, "Hey"),
    new What(63, "?")
};

そして、正しい順序のリスト:

List<int> OrderByList = new List<int>() { 78, 4, 63, 7, 12, 2 };

IComparerでは、次のように並べ替えるにはどうすればよいOrderByListでしょうか。私はそれを行う方法を本当に知りませんでした。これはlinqでかなり簡単になることは知っていますが、それを使用する機会がありません.

4

3 に答える 3

5

現在のコードには、いくつかの間違いがあります。ドキュメントをIComparer<T>見ると、T比較しようとしていることがわかります。あなたのコードではこれはTestそうですが、比較のためのコードに進みますWhat-これは、コードがコンパイルされないことを意味します。ここを参照してください- エラーメッセージは次のとおりです。

'Rextester.What' はインターフェイス メンバ 'System.Collections.Generic.IComparer.Compare(Rextester.Test, Rextester.Test)' を実装していません (
そこにある "Rextester" ビットは無視してください!)。

以上のことを踏まえて、以下を実装する必要がありますWhatComparer

public class WhatComparer : IComparer<What>
{
    private List<int> orderBy;
    public WhatComparer(List<int> orderBy)
    {
        this.orderBy = orderBy;
    }

    public int Compare(What x, What y)
    {
        return orderBy.IndexOf(x.ID).CompareTo(orderBy.IndexOf(y.ID));
    }
}

そしてそれを注文に使用します:

 WhatList.Sort(new WhatComparer(OrderByList));

実際の例: http://rextester.com/BZKO33641

于 2012-12-13T12:11:00.277 に答える