我有一个c#数据表,有3列。列/单元格将包含一个ascii字符,这些列用作这些字符的存储,因此是未命名的。
我想弄清楚如何计算给定字符在每行中出现的次数。
我需要计算字符'x'在每行中的出现次数。
一开始我想到了DataTable.Select
方法,然而我不仅不能找出一个合适的表达式,而且在进一步阅读后,我认为DataTable.Compute
可能更适合。
我看过MSDN的例子,但是它们都是在一列中求和所有的值,我还没有发现任何关于计算一行中所有值的东西。
一个例子。
想象我的表是这样的:
r j k
x f x
p p o
我想知道表中的每个字符在每行中出现多少次,所以在这种情况下:
r, j, k -在第0行中出现一次X -在第一行两次F - 1在第1行P -在第二行两次
可以执行Linq
查询,对DataRow.ItemArray
的值进行平整化和分组。然后,您可以从IEnumerable<IGrouping<object, object>>
中分别选择每个元素的Key
和Count
,字段的值及其在ItemArray
中的重复项。
假设你有一个DataTable
像…
var dt = new DataTable()
dt.Columns.Add("col1", typeof(string));
dt.Columns.Add("col2", typeof(string));
dt.Columns.Add("col3", typeof(string));
dt.Rows.Add("r", "j", "k");
dt.Rows.Add("x", "f", "x");
dt.Rows.Add("p", "p", "o");
In some caller…
var q = dt.AsEnumerable()
.SelectMany((r, i) => r.ItemArray
.GroupBy(g => g)
.Select(x => new
{
RowIndex = i,
Value = x.Key.ToString(),
Count = x.Count()
}));
foreach (var item in q) Console.WriteLine(item);
q
这里是匿名类型的IEnumerable
。您可以将其替换为模型/记录以获得/返回IEnumerable<T>
。
public class SomeModel
{
public int RowIndex { get; set; }
public string Value { get; set; }
public int Count { get; set; }
public override string ToString()
{
return $"{Value}, RowIndex: {RowIndex}, Count: {Count}";
}
}
并在查询中选择new SomeModel
:
var q = dt.AsEnumerable()
.SelectMany((r, i) => r.ItemArray
.GroupBy(g => g)
.Select(x => new SomeModel
{
RowIndex = i,
Value = x.Key.ToString(),
Count = x.Count()
}));
foreach (var item in q) Console.WriteLine(item);
输出:
r, RowIndex: 0, Count: 1
j, RowIndex: 0, Count: 1
k, RowIndex: 0, Count: 1
x, RowIndex: 1, Count: 2
f, RowIndex: 1, Count: 1
p, RowIndex: 2, Count: 2
o, RowIndex: 2, Count: 1