1

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

public interface Iinterface { }
public class Foo : Iinterface { }
public class Bar : Iinterface { }
[TestMethod()]
public void Test_Concat()
{
    var bars = new List<Bar>();
    var foos = new List<Foo>();
    // Ok
    IEnumerable<Iinterface> concats1 = bars.Cast<Iinterface>().Concat(foos.Cast<Iinterface>());
    // Compilation error
    IEnumerable<Iinterface> concats2 = bars.Concat(foos);
}

2 つのリストを 1 行に 1 つに連結し、コンパイル時にタイプ セーフを維持したい。

たとえば、 class のインターフェイスを削除した場合Foo、これはコンパイルされますが、実行時に失敗します。

public interface Iinterface { }
public class Foo { }
public class Bar : Iinterface { }
[TestMethod()]
public void Test_Concat()
{
    var bars = new List<Bar>();
    var foos = new List<Foo>();
    IEnumerable<Iinterface> concats1 = bars.Cast<Iinterface>().Concat(foos.Cast<Iinterface>());
}

を使用するOfType<T>()と、実行時に失敗することはありませんが、コンパイル時に失敗するようにします。私が見つけた最善の方法は、次の 3 行のコードを使用することです。

var list = new List<Iinterface>();
list.AddRange(bars);
list.AddRange(foos);

しかし、そのような単純なものについては、ワンライナーを見つけて、可能であれば のIEnumerable<Iinterface>代わりに を取得したいと考えていますList<Iinterface>
これを達成する方法はありますか?

4

5 に答える 5

3

独自のメソッドを記述できますか?

IEnumerable は共変であるため、ベースを指定するだけで済みます

var list= Combine<IInterface>(foos, bars);

private IEnumerable<T> Combine<T>(IEnumerable<T> ListA, IEnumerable<T> ListB)
{
    foreach (T t in ListA)
        yield return t;
    foreach (T t in ListB)
        yield return t;
}

あなたはちょうど書くかもしれませんが

var list= foos.Concat<IInterface>(bars);
于 2013-04-11T07:37:45.767 に答える