c#计算数据表中的不同值

时间:2017-06-13 07:41:54

标签: c# datatable data-manipulation

我的数据表中有什么

Resource

   1           // 1 represent normal
   1
   2           // 2 represent sql
   2
   3           // 3 css
   4           // 4 unicode
   4
   4

如何执行计算以便我可以在文本框中显示值

normal     2
sql        2
css        1
unicode    3

total hits 9

到目前为止我尝试了什么

var result = my_datatable.AsEnumerable().Sum(x => Convert.ToInt32(x["Resource"]));
string result2 = result.ToString();
totalTxtBox.Text = result2;

但它计算整列(输出为:24而不是9)

3 个答案:

答案 0 :(得分:0)

您可以尝试使用Distinct()

var result = my_datatable.AsEnumerable().Distinct().Sum(x => Convert.ToInt32(x["Resource"]));

Distinct()通过使用默认的相等比较器来比较值,从序列中返回不同的元素。

了解更多信息:https://msdn.microsoft.com/en-us/library/bb348436(v=vs.110).aspx

您可以尝试使用此示例作为参考。首先,我从数据表中获取Distinct值并将其转换为list,然后使用sum函数。

更新答案:

 DataTable my_datatable = new DataTable();
 my_datatable.Columns.Add("Value", typeof(int));
 my_datatable.Columns.Add("Type", typeof(string));

 my_datatable.Rows.Add(1, "Normal");
 my_datatable.Rows.Add(1, "Normal");
 my_datatable.Rows.Add(2, "SQL");
 my_datatable.Rows.Add(2, "SQL");
 my_datatable.Rows.Add(3, "CSS");
 my_datatable.Rows.Add(4, "UNICODE");
 my_datatable.Rows.Add(4, "UNICODE");
 my_datatable.Rows.Add(4, "UNICODE");

 var distinctIds = my_datatable.AsEnumerable()
               .Select(s => new {
                   value = s.Field<int>("value"),
               })
               .Distinct().ToList();


  int total = distinctIds.Sum(item => item.value);

答案 1 :(得分:0)

使用以下示例 -

re.findall

它将输出打印为 -

int[] res = { 1,1,2,2,3,4,4,4};

var words = res.AsEnumerable().GroupBy(x => x);

foreach (var x in words)
 {
Console.WriteLine(x.Key+"-"+x.Count());
 }

答案 2 :(得分:0)

我自己想出来了

使用此行(linq)来过滤掉您想要的值

        int normalcount = my_datatable
            .AsEnumerable()
            .Where(r => r.Field<string>("Resource") == "1")
            .Count();

根据您的列值

尝试更改此行以过滤掉哪个值
         .Where(r => r.Field<string>("Resource") == "2")
         .Count();