1

私は次のようなインターフェースIDictionary(文字列キーとリスト値を含む)を返そうとしています:

IDictionary<string, ICollection<ValueSet>> method( ...) {

}

メソッドの内部から、Dictionaryオブジェクトを作成します。

var dic = new Dictionary <string, List <ValueSet> >();

すべてうまくいきますが、dicここでオブジェクトを返すことはできません。暗黙的に変換することはできません。

どうすればこれを機能させることができますか?

public IDictionary < string, ICollection < ValueSet > > GetValueSets(ICollection < string > contentSetGuids)

{
    var dic = new Dictionary < string, List < ValueSet > > ();

    using (SqlCommand command = new SqlCommand())
    {
        StringBuilder sb = new StringBuilder(ValueSet.ValueSetQueryText);
        sb.Append(" where contentsetguid ");
        sb.Append(CreateInClause(contentSetGuids));

        command.CommandText = sb.ToString();

        dic = GetObjects(command).GroupBy(vs => vs.ContentSetGuid).ToDictionary(grp => grp.Key, grp => grp.ToList());

    }

    return dic;
}

エラー:エラー46タイプ'System.Collections.Generic.IDictionary>'を'System.Collections.Generic.IDictionary>'に暗黙的に変換できません。明示的な変換が存在します(キャストがありませんか?)

4

2 に答える 2

2

は共変ではないため、IDictionary<String, List<ValueSet>>をにキャストすることはできません。たとえば、インターフェース共変であるため、必要に応じてキャストできます。IDictionary<String, ICollection<ValueSet>>IDictionary<TKey, TValue>IEnumerable<T>IEnumerable<List<ValueSet>>IEnumerable<ICollection<ValueSet>>

ただし、メソッドで正しいタイプのディクショナリを作成することで、問題をある程度解決できます。例えば:

public IDictionary<string, ICollection<ValueSet>> GetValueSets(
    ICollection<ValueSet> contentSetGuids)
{
    var dic = new Dictionary<string, ICollection<ValueSet>>();   // <--

    using (SqlCommand command = new SqlCommand())
    {
        // ...
        dic = GetObjects(command)
              .GroupBy(vs => vs.ContentSetGuid)
              .ToDictionary(
                  grp => grp.Key,
                  grp => (ICollection<ValueSet>)grp.ToList());   // <--
    }

    return dic;
}
于 2013-02-19T21:04:59.037 に答える
0

インターフェイスをもう少し柔軟に変更することを検討します。

IEnumerable<KeyValuePair<string, IEnumerable<ValueSet>> GetValueSets(
    IEnumerable<ValueSet> contentSetGuids)

{
    // ....
    return GetObjects(command)
        .GroupBy(vs => vs.ContentSetGuid)
        .Select(new KeyValuePair<string, IEnumerable<ValueSet>>(grp.Key, grp.ToArray())
}

呼び出し元に辞書を作成させます。辞書が必要です。

通常、引数として文字列(キー)を渡し、一度に1つの要素のみを返します。ただし、この方法では、データ全体を一度に取得するため、これはあまり意味がありません。

于 2013-02-19T21:15:35.427 に答える