return IDictionary <string,icollection <valueset =“”>&gt; </string,>

时间:2013-02-19 20:44:01

标签: c# collections

我正在尝试返回接口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&gt;'到'System.Collections.Generic.IDictionary&gt;'。存在显式转换(您是否错过了演员?)

2 个答案:

答案 0 :(得分:2)

您无法将IDictionary<String, List<ValueSet>>投放到IDictionary<String, ICollection<ValueSet>>,因为IDictionary<TKey, TValue>不是covariant。例如,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;
}

答案 1 :(得分: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())
}

让调用者创建一个字典,它需要一个字典。

通常我会将字符串(键)作为参数传递,并一次只返回一个元素。但是在该方法中,您可以立即获得整个数据,因此这没有多大意义。