2012-03-13 2 views
1

Я хочу вычислить сумму столбца типа данных строки в datatable.sum string datatype datatable

Я уже пробовал это:

Int32 omarks = Convert.ToInt32(dt.Compute("Sum(Convert(Marks, 'System.Int32'))", "")); 
tbobtained.Text = omarks.ToString(); 

Но я получаю эту ошибку:

Синтаксическая ошибка в агрегированной аргумент: Ожидая один аргумент столбца с возможным ребенка классификатором.

ответ

2

Как об этом:

int omarks = dt.Rows.Select(dr=>(int)dr["Marks"]).Sum(); 
tbobtained.Text = omarks.ToString(); 

dr является аргументом функции лямбда, который принимает DataRow (это др) и возвращает целое значение столбца знаков.

Если вы хотите понять, почему этот код работает, вам необходимо освежиться на LINQ и C# lambda expressions.

+0

Мне нужно использовать этот код в цикле foreach? что такое dr в этом коде? –

+0

О, это сбивает с толку, я немного отредактирую. – zmbq

0

Это не должно нравиться вложенные вызовы функций, хотя в documentation of the expression syntax не упоминается никаких проблем с этим.

Я попытался извлекая вызов Convert() в вычисляемый столбец, как это ...

static void Main(string[] args) 
{ 
    int[] data = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 
    DataTable dt = CreateDataTable(data); 
    int omarks = Convert.ToInt32(dt.Compute("Sum(MarksInt)", "")); 
    string text = omarks.ToString(); 

    Console.WriteLine(omarks == data.Sum()); 
} 

static DataTable CreateDataTable(IEnumerable<int> data) 
{ 
    DataTable table = new DataTable(); 

    table.Columns.Add("Marks", typeof(string)); 
    table.Columns.Add("MarksInt", typeof(int), "Convert(Marks, 'System.Int32')"); 

    foreach (int i in data) 
    { 
     DataRow row = table.NewRow(); 

     row["Marks"] = i.ToString(); 

     table.Rows.Add(row); 
    } 

    return table; 
} 

... и он выполняет без выбрасывания Exception и правильно печатает true.

+0

Бэкон, используя свой путь, мне придется добавить в колонку «MarksInt» дополнительное имя столбца «MarksInt», которое не кажется правильным способом справиться с этим. я, наконец, должен был справиться с этим так. int omarks = 0; Еогеасп (DataRow др в dt.Rows) { , если (д-р [ "Marks"]. ToString()! = "А") { omarks = omarks + int.Parse (д-р [ "знаков"]. ToString()); } } tbobtained.Text = omarks.ToString(); –

+0

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

+0

бекон я хочу задать другой вопрос от u .. можете ли вы рассказать мне свой адрес электронной почты –

Смежные вопросы