2013-02-19 62 views
1

我试图返回接口IDictionary(与字符串键和列表值)像:返回的IDictionary <字符串,ICollection的<ValueSet>>

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

} 

从方法的内部创建的字典对象:

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>'。存在明确的转换(您是否缺少演员?)

+1

这是什么语言? – 2013-02-19 20:44:49

+0

C#........................ – user2047824 2013-02-19 20:51:24

+2

您是否可以更新您的问题以显示完整的方法以及完整的错误? – cepatt 2013-02-19 20:57:40

回答

2

您不能将IDictionary<String, List<ValueSet>>转换为IDictionary<String, ICollection<ValueSet>>,因为IDictionary<TKey, TValue>不是covariant。例如,IEnumerable<T>接口 covariant,因此如果需要,您可以将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; 
} 
+0

这很好用!谢谢! – user2047824 2013-02-19 21:14:32

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()) 
} 

让来电者创建一个字典,它是需要一个。

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

相关问题