15

次のタイプが与えられます:

public interface IMyClass { }
public class MyClass : IMyClass { }

どうすればaをに変換できList<MyClass>ますList<IMyClass>か?共分散/反変性のトピックについては完全には明確ではありませんが、そのためにリストを単純にキャストすることはできないことを理解しています。

私はこの些細な解決策しか思いつかなかった。優雅さを欠き、資源を浪費する:

...
public List<IMyClass> ConvertItems(List<MyClass> input)
{
   var result = new List<IMyClass>(input.Count);
   foreach (var item in input)
   {
       result.Add(item);
   }
   return result;
}
....

どうすればよりエレガントでパフォーマンスの高い方法でそれを解決できますか?

.NET 2.0ソリューションが必要ですが、完全を期すために、新しいフレームワークバージョンを使用したより洗練されたソリューションも見たいと思います。

4

3 に答える 3

24

最も簡単な方法は、おそらく次を使用することConvertAllです。

List<IMyClass> converted = original.ConvertAll<IMyClass>(x => x);

.NET 2を使用している場合でも、VS2008以降を使用している場合はラムダ構文を使用できます。それ以外の場合は、常に匿名メソッドがあります。

List<IMyClass> converted = original.ConvertAll<IMyClass>(
    delegate (MyClass x) { return x; });

Cast.NET 3.5では、LINQを、、OfTypeまたは単にSelect:で使用できます。

var converted = original.Cast<IMyClass>().ToList();
var converted = original.OfType<IMyClass>().ToList();
var converted = original.Select(x => (IMyClass) x).ToList();

.NET 4.0では、 :ToListの共分散により、中間キャストなしで直接使用できます。IEnumerable<T>

var converted = original.ToList<IMyClass>();
于 2011-02-08T10:20:34.270 に答える
2

リストである必要がありますか?解決策はIEnumerableより効率的かもしれません:

 public IEnumerable<IMyClass> ConvertItems(List<MyClass> input)
 {
    foreach (var item in input)
    {
        yield return (IMyClass)item;
    }
 } 
于 2011-02-08T10:23:10.280 に答える
0

(.NET 3.5ソリューション)

List<MyClass> list = new List<MyClass> { ... };
List<IMyClass> converted = list.Cast<IMyClass>().ToList();
于 2011-02-08T10:21:41.120 に答える