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

您不能将 aIDictionary<String, List<ValueSet>>转换为 aIDictionary<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())
}

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

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

于 2013-02-19T21:15:35.427 回答