【问题标题】:collection with in collection收藏中的收藏
【发布时间】:2019-08-12 15:04:49
【问题描述】:

我有一个 C# 方法

private IEnumerable<KeyValuePair<string, IEnumerable<KeyValuePair<string, SimpleRule>>>> GetPSPFlags(long Id, string promo, int vs)
{
    const string qry = "select context, flag, name, rule " +
                       "from flags " +
                       "where id = :pId " +
                       "and code = :pc " +
                       "and vs = :v "

    var p = new OracleParameter[3];
    p[0] = new OracleParameter(":pId", Id);
    p[1] = new OracleParameter(":pc", promo);
    p[2] = new OracleParameter(":v", vs);
    string error;
    var results = Select(qry, p, out error);
    if (!string.IsNullOrEmpty(error)) throw new ApplicationException(error);

    return results.Rows.Cast<DataRow>().ToDictionary(row => ToString(row["flag"]), row => SimpleRuleParser.GetRule(ToString(row["rule"])));
}

我在返回类型中遇到错误。如何返回上下文、标志、名称和规则的集合?

【问题讨论】:

  • 你的错误是什么?
  • SimpleRuleParser.GetRule 返回什么类型?

标签: c# .net dictionary c#-4.0 collections


【解决方案1】:

我假设SimpleRuleParser.GetRule 返回一个Dictionary&lt;string, SimpleRule&gt;。如果要将规则作为KeyValuePairs 的枚举返回,则将值转换为该类型

return results.Rows.Cast<DataRow>().ToDictionary(
    row => ToString(row["flag"]),
    row => (IEnumerable<KeyValuePair<string, SimpleRule>>)SimpleRuleParser.GetRule(
               ToString(row["rule"]))
           );

你得到的错误是因为你不能投一个

IEnumerable<KeyValuePair<string, Dictionary<string, SimpleRule>>>

到一个

IEnumerable<KeyValuePair<string, IEnumerable<KeyValuePair<string, SimpleRule>>>>

我为解析值引入的强制转换具有你得到一个

的效果
Dictionary<string, IEnumerable<KeyValuePair<string, SimpleRule>>>

实现所需的方法返回类型

IEnumerable<KeyValuePair<string, IEnumerable<KeyValuePair<string, SimpleRule>>>>

您的问题是关于泛型类型的协变和逆变。另请参阅我的answer 这个问题:C# 3.0 implicit cast error with class and interfaces with generic type

注意:Dictionary&lt;,&gt; 的优点是它允许通过键非常快速地访问值,而必须始终枚举 IEnumerable&lt;&gt; 以查找特定条目。所以实际上可能会更好地通过其原始类型返回结果Dictionary&lt;string, Dictionary&lt;string, SimpleRule&gt;&gt;

【讨论】:

  • 感谢您的帮助!我如何返回这样的东西:collection[context,collection[flag]]
  • 如果您将结果分配给一个温度为var temp = CreateTheCollection();,然后在Visual Studio 中选择temp,则会出现一个灯泡。单击它并选择Use explicit type instead of 'var'。 VS 将用显式类型替换var。您可以将其用作返回类型。
猜你喜欢
  • 2013-08-02
  • 2019-12-17
  • 1970-01-01
  • 1970-01-01
  • 2012-04-16
  • 1970-01-01
  • 2014-05-11
  • 1970-01-01
  • 2012-12-11
相关资源
最近更新 更多