3

同僚が、多数の汎用リストコレクションを含むオブジェクトを持っています。リスト内の各タイプは、特定のインターフェースを実装します。彼は、他のすべてのリストを含むリストを作成して、オブジェクトが実装するメソッドをループして呼び出すことができるようにしたいと考えています。以下は簡単な例です。

 List<Dx> dxs = new List<Dx>();
 dxs.Add(new Dx());
 dxs.Add(new Dx());

 List<Proc> procs = new List<Proc>();
 procs.Add(new Proc());

 List<List<IClean>> lists = new List<List<IClean>>();
 lists.Add(procs); // Error here
 lists.Add(dxs); // Error here

 foreach (List<IClean> list in lists)
 {
     foreach (IClean i in list)
     {        
         i.Clean();
     }
 }

DxとProcはどちらもICleanを実装しています。これが目標です。このようなことは可能ですか?または、これは悪いプログラミングですか?

.NETバージョン4.0

4

4 に答える 4

9

List<IClean>の両方の実装を保持するシングルを作成することもできますIClean

var list = new List<IClean>();
    list.Add(new Dx());
    list.Add(new Proc());

foreach(var clean in list)
{
   clean.Clean();
}

さらに、実際に2つの個別の実装リストを維持してからそれらを一緒に処理する必要がある場合は、次のようにすることができます。

var dx = new List<Dx>();
var proc = new List<Proc>();

List<IClean> list = new List<IClean>();
list.AddRange(dx);
list.AddRange(proc);

foreach(var clean in list)
{
   clean.Clean();
}
于 2012-07-23T19:18:16.627 に答える
4

これらのタイプは共変ではないため、Listまたはを使用してこれを行うことはできません。IListつまり、を持っている場合はそれList<IClean>に追加できるはずですが、持っている場合は追加できません。したがって、aはではありません。DxList<Proc>List<Proc>List<IClean>

IEnumerable<>ただし、.NET 4以降では、次のコマンドを使用してこれを行うことができます。

 List<Dx> dxs = new List<Dx>();
 dxs.Add(new Dx());
 dxs.Add(new Dx());

 List<Proc> procs = new List<Proc>();
 procs.Add(new Proc());

 List<IEnumerable<IClean>> lists = new List<IEnumerable<IClean>>();
 lists.Add(procs); 
 lists.Add(dxs); 

 foreach (List<IClean> list in lists)
 {
     foreach (IClean i in list)
     {        
         i.Clean();
     }
 }
于 2012-07-23T19:18:50.017 に答える
3

どうですか:

using System.Linq;

...

foreach( var clean in procs.Cast<IClean>().Concat(dxs.Cast<IClean>()) )
{
    clean.Clean();
} 
于 2012-07-23T19:20:42.777 に答える
0

以下を出力するLinqPadコードスニペットは次のとおりです。

Procクリーニング済みDxクリーニング済みDxクリーニング済み

void Main()
{
    List<IClean> dxs = new List<IClean>();  
    dxs.Add(new Dx());  
    dxs.Add(new Dx());   

    List<IClean> procs = new List<IClean>();  
    procs.Add(new Proc());   

    List< List<IClean> > lists = new List< List<IClean> >();  

    lists.Add(procs); 
    lists.Add(dxs);

    foreach (List<IClean> list in lists)
    {      
        foreach (IClean i in list)      
        {                  
            i.Clean();      
        }  
    } 
}

// Define other methods and classes here
public interface IClean 
{
  void Clean();
}
public class Dx : IClean
{
    public  void Clean()
    {
        "Dx cleaned".Dump();
    }
}

public class Proc : IClean
{
    public void Clean()
    {
        "Proc cleaned".Dump();
    }
}
于 2012-07-23T19:26:19.080 に答える