коллекция с в коллекции - PullRequest
0 голосов
/ 21 марта 2019

У меня есть метод в 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"])));
}

Я получаю ошибку в типе возврата. Как я могу вернуть коллекцию контекста, флага, имени и правила?

1 Ответ

0 голосов
/ 21 марта 2019

Я предполагаю, что SimpleRuleParser.GetRule возвращает Dictionary<string, SimpleRule>. Если вы хотите вернуть правила как перечисление 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>>>>

Ваша проблема касается ковариации и контравариантности родовых типов. См. Также мой ответ на этот вопрос: C # 3.0 неявная ошибка приведения с классом и интерфейсами с универсальным типом

Примечание. Преимущество Dictionary<,> состоит в том, что он обеспечивает очень быстрый доступ к значениям по клавише, в то время как IEnumerable<> всегда должен быть перечислен, чтобы найти конкретную запись. Поэтому на самом деле может быть лучше вернуть результат через исходный тип Dictionary<string, Dictionary<string, SimpleRule>>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...