4

インターフェイス IFoo を実装するクラスがいくつかあります。これらのクラスのオブジェクトのリストをテーブルに表示する必要があります。テーブル内の任意の列でソートできるようにしたいと考えています。したがって、テーブルのデータ ソースはList<IFoo>.

私が遭遇した問題は、リストで使用されるオブジェクトを実装する標準的な方法でIComparableIComparer静的メソッドが必要ですが、インターフェイスでは静的メソッドが許可されていないことです。したがって、質問はこれに要約されList<IFoo>ます。

4

3 に答える 3

9

IComparable

静的な方法を使用する必要があるという考えが何にあるのかわかりませんが、正しくありません。

以下に追加することで、すべての実装者に強制的IFooに実装させることができます。IComparable<IFoo>IFoo

interface IFoo : IComparable<IFoo> 
{ 
    int Value { get; set; } // for example's sake
}

class SomeFoo : IFoo
{
    public int Value { get; set; }

    public int CompareTo(IFoo other)
    {
        // implement your custom comparison here...

        return Value.CompareTo(other.Value); // e.g.
    }
}

List<IFoo>次に、次のように並べ替えます。

list.Sort();

任意の列による並べ替え

最初に、IFooオブジェクトのテーブルの任意の列で並べ替えたいと述べました。これはもっと複雑です。オブジェクトのリストをそれらのパブリックプロパティのいずれかで並べ替えることができる必要があるため、IComparable<IFoo>上記の基本的な実装ではそれを削減することはできません。

PropertyComparer<T>解決策は、を実装するクラスを作成し、の任意のプロパティでIComparer<T>並べ替えることです。あなたはそれを特別に書くことができますが、ある時点ですべての開発者はこの問題に直面する傾向があり、あらゆるタイプをソートしようとする一般的なプロパティ比較器を書くことになります。その結果、「c#property comparer」をグーグルで検索でき、確実にいくつかのヒットを得ることができます。これが簡単なものです: TIFoo

http://www.codeproject.com/Articles/16200/Simple-PropertyComparer

于 2012-02-29T16:08:12.463 に答える
3

簡単なテストを実行し、IFoo のリストを並べ替えることができたので、どのような問題が発生しているのかわかりません。私がこれをどのように行ったかについては、以下を参照してください。これがあなたのニーズに合わない場合は、詳細を教えていただけますか?

var fooList = new List<IFoo>{new testFoo{key=3}, new testFoo{key=1}};
fooList.Sort(
    delegate(IFoo obj1, IFoo obj2){return obj1.key.CompareTo(obj2.key);});

インターフェイスとコンクリート

public interface IFoo
{
     int key{get;set;}
}

public class testFoo:IFoo
{
    public int key {get;set;}
}
于 2012-02-29T16:11:32.870 に答える
2

C#3/4を使用している場合は、ラムダ式を使用できます。

この例は、IFooインターフェイスのさまざまなプロパティで並べ替える方法を示しています。

void Main()
{
    List<IFoo> foos = new List<IFoo>
    {
        new Bar2{ Name = "Pqr", Price = 789.15m, SomeNumber = 3 },
        new Bar2{ Name = "Jkl", Price = 444.25m, SomeNumber = 1 },
        new Bar1{ Name = "Def", Price = 222.5m, SomeDate = DateTime.Now },
        new Bar1{ Name = "Ghi", Price = 111.1m, SomeDate = DateTime.Now },
        new Bar1{ Name = "Abc", Price = 123.45m, SomeDate = DateTime.Now },
        new Bar2{ Name = "Mno", Price = 564.33m, SomeNumber = 2 }

    };

    foos.Sort((x,y) => x.Name.CompareTo(y.Name));
    foreach(IFoo foo in foos)
    {
        Console.WriteLine(foo.Name);
    }

    foos.Sort((x,y) => x.Price.CompareTo(y.Price));
    foreach(IFoo foo in foos)
    {
        Console.WriteLine(foo.Price);
    }
}

interface IFoo
{
    string Name { get; set; }
    decimal Price { get; set; }
}

class Bar1 : IFoo
{
    public string Name { get; set; }
    public decimal Price { get; set; }
    public DateTime SomeDate { get; set; }
}

class Bar2 : IFoo
{
    public string Name { get; set; }
    public decimal Price { get; set; }
    public int SomeNumber { get; set; }
}

出力:

Abc
Def
Ghi
Jkl
Mno
Pqr
111.1
222.5
333.33
444.25
555.45
666.15
于 2012-02-29T16:52:27.243 に答える