2

私のプロジェクトには次のクラスがあります。

[Serializable]
public class BaseEntityCollection<T> : List<T> where T : BaseEntity, new()
{

    protected BaseEntityCollection()
    {
    }

}

[Serializable]
public abstract class BaseEntity
{
    protected BaseEntity()
    {
    }
}


public class MyClassCollection : BaseEntityCollection<MyClass>
{
}

問題領域

MyClassCollection objList = 
MyClassName.MyFunctionName().OrderByDescending(i => i.MyPropertyName);

この行はコンパイルエラーを引き起こしています。

Cannot implicitly convert type System.LinQ.IOrderedEnumerable<MyClass>
to MyClassCollection. An implicit conversion exists(are you missing a
cast?)

編集

アーキテクチャの設計を変更する権限がありません。

4

3 に答える 3

5

なぜそれが機能すると期待するのかは明確ではありませんが、次を使用できます。

MyClassCollection objList = new MyClassCollection();
objList.AddRange(MyClassName.MyFunctionName()
                            .OrderByDescending(i => i.MyPropertyName));

個人的にList<T>は、そもそも新しいコレクションを派生させたり、型引数を固定するためだけにジェネリッククラスから非ジェネリッククラスを派生させたりするのは嫌いですが、それがアーキテクチャである場合は...

于 2012-04-23T14:31:23.407 に答える
1
var orderedItems = MyClassName.MyFunctionName().OrderByDescending(i => i.MyPropertyName);
MyClassCollection objList = new MyClassCollection(orderedItems);

追加したときの式の結果は、OrderByDescendingを実装するフレームワーククラスでIOrderedEnumerable<T>あり、暗黙的にに変換することはできませんMyClassCollection。上記のように、暗黙的な変換を追加することも、IEnumerable<T>継承元のコンストラクターに任意の変換を渡すこともできますList<T>

于 2012-04-23T14:23:50.920 に答える
0

新しいコレクションを作成しますか、それとも返されたコレクションを並べ替えますか?後である場合はOrderByDescending、LINQ全般を忘れて、代わりにList.Sortを使用してください。

問題は、OrderByDescendingを呼び出すと、を実装する新しい内部LINQオブジェクトが作成されることIOrderedEnumerableです。List次に、またはのような実際のコレクションを作成する必要がありますArray

BaseEntityCollection<t>問題を解決するには、次のようにIEnumerable構造をオーバーライドする必要があります。

public BaseEntityCollection(IEnumerable<T> items):base(items)
{
}

そしてそれを次のように呼びます:

  MyClassCollection objList = new MyClassCollection(MyClassName.MyFunctionName().OrderByDescending(i => i.MyPropertyName));

しかし、私はあなたのデザイン全体に本当に疑問を投げかけます。LINQの使用方法が間違っているため、使用を開始する前に、LINQについて詳しく読む必要があります。

于 2012-04-23T14:30:47.050 に答える