2

次のコードは、ループしてresultSetリスト a を作成しSomeTypeます。それresultSet自体は 2 つのプロパティを持つ匿名型です

var resultSet = SomeCollection.Select(x => new {
    FirstProp = x,
    SomeMembers = SomeLinkCollection.Where(l => l.SomeId == x.SomeId)
                                    .Select(l => AnotherCollection[l.Id])
});

var result = new List<SomeType>();
foreach (var currentGroup in resultSet) {
    result.Add(new SomeType {
        Prop1 = currentGroup.Item.Id,
        Prop2 = currentGroup.Item.Name,
        Prop3 = currentGroup.SomeMembers.OrderBy(x => x.Name)
    });
}

新しいインスタンスの設定を削除するためSometypeに、動的型を使用してマッパー クラス/インターフェイスを作成し、責任を分割して依存関係注入を使用しました。

public class SomeMapper : ISomeMapper {
    public List<SomeType> Map(dynamic resultSet) {
        return resultSet.Select(new SomeType {
            Prop1 = currentGroup.Item.Id,
            Prop2 = currentGroup.Item.Name,
            Prop3 = ((IEnumerable<AnotherType>)resultSet.SomeMembers)
                                                .OrderBy(x => x.Name)
        });
    }
}

したがって、上記のコードは次のようになります。

return resultSet.Select(SomeMapper.Map);

エラー

タイプ 'System.Collections.Generic.IEnumerable>' を 'System.Collections.Generic.List' に暗黙的に変換することはできません。明示的な変換が存在します (キャストがありませんか?)

明示的なキャストを使用していくつかのトリックを試しましSomeTypeたが、実行時に失敗します

return (List<SomeType>)groupSet.Select(statusGroupMapper.Map);


タイプ'WhereSelectListIterator 2[AnotherType,System.Collections.Generic.List1[SomeType]]' のオブジェクトをタイプ 'System.Collections.Generic.List`1[SomeType]'にキャストできません。

4

1 に答える 1

3

結果のリストを作成する必要があります。

式の後に追加するだけ.ToList()です:

public class SomeMapper : ISomeMapper {
    public List<SomeType> Map(dynamic resultSet) {
        return resultSet.Select(new SomeType {
            Prop1 = currentGroup.Item.Id,
            Prop2 = currentGroup.Item.Name,
            Prop3 = ((IEnumerable<AnotherType>)resultSet.SomeMembers).OrderBy(x => x.Name)
        }).ToList();
    }
}

.Select(...)IEnumerable<T>ではなく を返すList<T>ため、これはこのメソッドで発生する問題とまったく同じタイプです。

public string Name()
{
    return 10; // int
}

呼び出すときにも問題があります。これを行わないでください。

return (List<SomeType>)groupSet.Select(statusGroupMapper.Map);

これを行うだけです:

return statusGroupMapper.Map(groupSet);
于 2013-07-17T11:47:20.033 に答える