5

この現在のプロジェクトは、より大きなプロジェクトの概念実証に近いものです。同一の列構造を持つ 2 つの「テーブル」(以下のリストとして表される)CatListとがあります。を使用して、結果セットに対してクエリを実行できるようDogListにしたいと考えています。実践することでこのような成果が得られるとのことでした。ConcatUnionLINQinterfaces

これが私がこれまでに持っているものです:

        static void Main(string[] args)
    {
        System.Console.Write("Hello World\n");
        Dog Dog1 = new Dog { name = "A", age = 1 };
        Dog Dog2 = new Dog { name = "B", age = 2 };
        Cat Cat1 = new Cat { name = "C", age = 3 };
        Cat Cat2 = new Cat { name = "D", age = 4 };

        List<Dog> DogList = new List<Dog>();
        List<Cat> CatList = new List<Cat>();
        DogList.Add(Dog1);
        DogList.Add(Dog2);
        CatList.Add(Cat1);
        CatList.Add(Cat2);

        var result = DogList
                .Concat(CatList);

    }
}

public interface iAnimal
{
    string name { get; set; }
    int age { get; set; }
}
public class Dog :iAnimal
{
    public string name { get; set; }
    public int age { get; set; }
}
public class Cat:iAnimal
{
    public string name { get; set; }
    public int age { get; set; }
}

のようなものを使用して、作成したオブジェクトのデータ メンバーにアクセスできるSystem.Console.Write(Dog1.name);ので、インターフェイスの実装は正しいと思います。リストを効果的に連結/結合するために、LINQ ステートメントで何を変更する必要がありますか。

私はC#一般的にオブジェクト指向プログラミングにかなり慣れていないので、私の知識レベルに合わせて回答を調整してください。

ありがとう

EDIT 現在のコードに表示されるエラー メッセージを含めるのを忘れていたため、お詫び申し上げます。

Error   1   'System.Collections.Generic.List<InterfaceTest.Dog>' does not contain a definition for 'Concat' and the best extension method overload 'System.Linq.ParallelEnumerable.Concat<TSource>(System.Linq.ParallelQuery<TSource>, System.Collections.Generic.IEnumerable<TSource>)' has some invalid arguments

Error   2   Instance argument: cannot convert from 'System.Collections.Generic.List<InterfaceTest.Dog>' to 'System.Linq.ParallelQuery<InterfaceTest.Cat>'
4

2 に答える 2

13

List<Dog>問題は、コンパイラが aと aを連結して s のList<Cat>コレクションを生成する必要があることを理解できないことiAnimalです。デフォルトでは、を認識しList<Dog>、次のコレクションも のコレクションであると想定しますDog

iAnimalジェネリック パラメータをConcatに指定することで、すべてを this として扱うように明示的に指示できます。

var result = DogList.Concat<iAnimal>(CatList);

次に、resultof typeを取得しIEnumerable<iAnimal>ます。

編集: .NET 3.5 で行き詰まっている場合は、次のようなものが必要になります。

var result = DogList.Cast<IAnimal>().Concat(CatList.Cast<IAnimal>());

3.5 は に自動的に変換できないcollection of something that inherits iAnimalためcollection of iAnimal

于 2013-01-08T16:49:13.973 に答える
3

ジェネリック リストはさまざまなタイプ (Dog と Cat) のものであり、連結する前にターゲット インターフェイスに「キャスト」する必要があります。

var list1 = DogList.Cast<IAnimal>();
var list2 = CatList.Cast<IAnimal>();

var bothLists = list1.Concat(list2); //optional .ToList()
于 2013-01-08T16:48:32.957 に答える