Ошибка при выполнении метода Ienumerable <Datarow>.Sum (). - PullRequest
0 голосов
/ 19 августа 2010

Почему не работает приведенный ниже код? Я получаю следующую ошибку.

Невозможно неявно преобразовать тип 'V' в int.

private ObservableCollection<DataItem> method<T, V>(DataTable dt, SeriesItem seriesItem, FilterValues filter, ObservableCollection<DataItem> chart)
{
    var result = from t in dt.AsEnumerable()
                 group t by new { type = t.Field<T>(seriesItem.LabelMapping).ToString().ToUpper() } into g
                 orderby g.Key.type
                 select new
                 {
                     Item_Type = g.Key.type.ToString(),
                     Amount = seriesItem.IsSum 
                          ? g.Sum(s => s.Field<V>(seriesItem.ValueMapping)) 
                          : g.Count()
                 };

    foreach (var g in result) 
    { 
        chart.Add(new DataItem(g.Item_Type, double.Parse(g.Amount.ToString()))
                  { 
                      IsSum = seriesItem.IsSum, 
                      IsDisplayCurrency = seriesItem.IsDisplayCurrency 
                  }); 
    }
    return chart;
}

Ответы [ 3 ]

0 голосов
/ 19 августа 2010

Проблема в том, что вы пытаетесь суммировать все значения типа V.

s.Field<V>(...) возвращает значение типа V, поэтому анонимная функция селектора s => s.Field<V>(...) также возвращает значениетип V. Однако для g.Sum(...) требуется функция селектора, которая возвращает значения одного из следующих типов: decimal, double, float, int, long (или их аналоговые значения).Невозможно неявно привести тип V к любому из этих типов.

Если столбец отображения значений всегда имеет определенный тип, используйте этот тип явно вместо универсального типа V.

0 голосов
/ 19 августа 2010

Глядя на ваш код, я полагаю, этот бит кода возвращает значение типа V:

s => s.Field<V>(seriesItem.ValueMapping)

, если это так, учитывая, что для типа V нет ограничений (это может бытьчто-нибудь, объект, строка и т. д. и т. д.) компилятор не сможет выяснить, какой из перегруженных методов Enumerable.Sum () вызвать, следовательно, ошибка компилятора.

Предполагая, что тип V известен только во время выполнения (так что вы не можете просто ограничить V до int / decimal / double и т. Д.), Как насчет добавления делегата в метод, который можно использовать для возврата int из объекта типа V?Например:

private ObservableCollection<DataItem> method<T, V>(DataTable dt, SeriesItem seriesItem, FilterValues filter, ObservableCollection<DataItem> chart, Func<V, int> convertV)
    {
        var result = from t in dt.AsEnumerable()
                     group t by new { type = t.Field<T>(seriesItem.LabelMapping).ToString().ToUpper() } into g
                     orderby g.Key.type
                     select new
                     {
                         Item_Type = g.Key.type.ToString(),
                         Amount = seriesItem.IsSum ? g.Sum(s => convertV(s.Field<V>(seriesItem.ValueMapping))) : g.Count()
                     };

, тогда вы возлагаете ответственность на вызывающую сторону (которая будет знать типы T и V), чтобы выяснить, как преобразовать V в int.

0 голосов
/ 19 августа 2010

g.Count() возвращает целое число

IsSum ? g.Sum() : g.Count() должно быть целым числом

, поэтому g.Sum() должно быть целым числом

, поэтому V должно быть целым числом

Ничто (кроме этого вывода) не мешает V быть decimal или чем-то еще, отсюда и сообщение об ошибке компилятора.

Исправить: Любой из этих:

  • удалить V и получить результаты int
  • удалить g.Count()
  • приведение g.Count () для удвоения и исправления типа V как двойного.

Этот последний имеет дополнительное преимущество: вы можете удалить код двойного преобразования позже в методе.


@ Daniel Renshaw

List<decimal> source = new List<decimal>();
int result = source.Sum<decimal>();  //compile error
  //Cannot implicitly convert type 'decimal' to 'int'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...