1

クラスがあるとしましょう

class ComplexCls
{
  public int Fld1;
  public string Fld2;
  //could be more fields
}

class Cls
{
  public int SomeField;
}

そして、いくつかのコード

class ComplexClsList: List<ComplexCls>;
ComplexClsList myComplexList;
// fill myComplexList

// same for Cls    
class ClsList : List<Cls>;
ClsList myClsList;

(疑似コード) のように、myComplexList から myClsList を設定します。

foreach Complexitem in myComplexList
{
  Cls ClsItem = new Cls();
  ClsItem.SomeField = ComplexItem.Fld1;
}

これを行うコードは簡単で、myClsList のメソッドに配置されます。ただし、ジェネリック ComplexCls のために、これを可能な限りジェネリックに設計したいと思います。このコードを使用する時点で正確な ComplexCls がわかっていることに注意してください。アルゴリズムのみが一般的です。
(直接)リフレクションを使用して実行できることは知っていますが、他の解決策はありますか?質問が十分に明確でない場合はお知らせください。(おそらくそうではありません)。[編集] 基本的に、必要なのはこれです: myClsList があれば、DataSource (ComplexClsList) とその DataSource (Fld1) のフィールドを指定する必要があります。

4

3 に答える 3

4

これは単なるマッピングなので、簡単な LINQ を使用します。

ClsList myClsList = new ClsList();
myClsList.AddRange(
  myComplexList.Select(Complexitem => new Cls { SomeField = Complexitem.Fld1 })
);
于 2013-10-24T21:50:54.247 に答える
2

さて、クラスに既知のターゲットフィールドがあると仮定した場合の簡単なバージョン (これは拡張メソッドとして記述したので、実行する必要はありません)

public IEnumerable<Cls> MapField<TSource>(IEnumerable<TSource> sourceList, 
                                          Func<TSource, int> sourceSelector)
{
  return sourceList.Select(x => new Cls {SomeField = sourceSelector(x)});
}

こう呼ばれた

IEnumerable<Cls> result = MapField(myComplexList, x => x.Fld1);

余談:あなたmyComplexListの型は(これを実装する)ComplexClsListから継承されているため、これは機能します。結果は必要な型ではありませんが、結果を簡単に呼び出して、.ListIEnumerableClsList.ToList()ClsListList<Cls>


そして、ターゲット フィールド (または型) がわからない場合のより複雑なバージョン...

public IEnumerable<TResult> MapField<TSource, TResult, TMap>(
    IEnumerable<TSource> sourceList, 
    Func<TSource, TMap> sourceSelector,
    Func<TMap, TResult> resultCreator)
{
    return sourceList.Select(x => resultCreator(sourceSelector(x)));
}

呼ぶほど可愛くない……。

IEnumerable<Cls> result = MapField(
    myComplexList,
    source => source.Fld1,
    valueToMap => new Cls() {SomeField = valueToMap});

より良い方法かもしれませんが、現時点では私には起こりません。

編集:実際にはFunc、最後の 2 つを を取りTSource、必要なフィールドを作成して にマップする1 つに組み合わせることができTResultますが、その追加の抽象化レイヤーで何を得ているのか本当にわかりません...

于 2013-10-25T16:33:54.223 に答える
0

Listそもそもクラスの拡張を再検討する必要があるかもしれません。この場合、継承によって何が得られるでしょうか。ここでは、継承よりも構成を優先する方がよいと思います。1つの可能なアプローチは次のとおりです。

// If you would say that a ComplexCls "is a" Cls, then maybe your inheritance
// relationship belongs here instead.
public class ComplexCls : Cls { 
}

public class ClsList
{
  public IReadOnlyCollection<Cls> Items {get;set;}
}

public class ComplexClsList
{
  public IReadOnlyCollection<ComplexCls> Items {get;set;}
}

その後、ClsClist を簡単に作成できます。

ClsList basicList = new ClsList{Items = complexList.Items};

しかし、さらに一歩進んで、ClsListおよびComplexClsListクラスが存在する理由を疑問視することもできます。List単純にs を直接渡さないのはなぜですか。ClsListつまり、 aと "Clses のリスト" ( List<Cls>)の違いは何ですか?

于 2013-10-24T21:53:58.940 に答える