C# 在LINQ中跨多个列计数

C# 在LINQ中跨多个列计数,c#,linq,C#,Linq,我知道这个问题的最佳答案是一个更好的优化DB,但是在当前的结构上有可能优化这个总和吗 表格是这样的: rowid a1 b1 b2 b3 123 s s n s 124 n n n n 125 s n s s var rows = new [] { new { RowNumber = 123, Chars = new Char[] { 's', 's', 'n', 's' } }, n

我知道这个问题的最佳答案是一个更好的优化DB,但是在当前的结构上有可能优化这个总和吗

表格是这样的:

rowid a1 b1 b2 b3
123   s  s  n  s
124   n  n  n  n
125   s  n  s  s
var rows =
        new []
        {
            new { RowNumber = 123, Chars = new Char[] { 's', 's', 'n', 's' } },
            new { RowNumber = 123, Chars = new Char[] { 'n', 'n', 'n', 'n' } },
            new { RowNumber = 123, Chars = new Char[] { 's', 'n', 's', 's' } }
        };

    var count =
        rows
            .SelectMany(row => row.Chars)
            .Count(chr => chr == 's');
我需要数一数所有“s”的数目


使用
SelectMany
将每行的列展平为一个长列表:

var result = items.SelectMany(i=> new string[] {i.a1, i.b1, i.b2, i.b3 })
                  .Count(i => i == "s");

使用
SelectMany
将每行的列展平为一个长列表:

var result = items.SelectMany(i=> new string[] {i.a1, i.b1, i.b2, i.b3 })
                  .Count(i => i == "s");

如果您真的有这么多字段,并且需要计算所有字段,那么您可以使用反射:

var sCount = data
    .Sum(x => x.GetType().GetProperties().Count(prop => prop.GetValue(x) as string == "s"));

如果您真的有这么多字段,并且需要计算所有字段,那么您可以使用反射:

var sCount = data
    .Sum(x => x.GetType().GetProperties().Count(prop => prop.GetValue(x) as string == "s"));

我不确定您是如何存储数据的,但您可以这样做:

rowid a1 b1 b2 b3
123   s  s  n  s
124   n  n  n  n
125   s  n  s  s
var rows =
        new []
        {
            new { RowNumber = 123, Chars = new Char[] { 's', 's', 'n', 's' } },
            new { RowNumber = 123, Chars = new Char[] { 'n', 'n', 'n', 'n' } },
            new { RowNumber = 123, Chars = new Char[] { 's', 'n', 's', 's' } }
        };

    var count =
        rows
            .SelectMany(row => row.Chars)
            .Count(chr => chr == 's');

我不确定您是如何存储数据的,但您可以这样做:

rowid a1 b1 b2 b3
123   s  s  n  s
124   n  n  n  n
125   s  n  s  s
var rows =
        new []
        {
            new { RowNumber = 123, Chars = new Char[] { 's', 's', 'n', 's' } },
            new { RowNumber = 123, Chars = new Char[] { 'n', 'n', 'n', 'n' } },
            new { RowNumber = 123, Chars = new Char[] { 's', 'n', 's', 's' } }
        };

    var count =
        rows
            .SelectMany(row => row.Chars)
            .Count(chr => chr == 's');

可能的重复:它将帮助我们了解所有东西的类型。如果你
var
这一切都让你很难理解。Not SQL related@amura.cxgp可能的重复:这将帮助我们了解一切都是什么类型的。如果你
var
这一切都让你很难理解。Not SQL related@amura.cxg这个答案与我已经发布的答案有什么不同吗?。。。你还改变了这里的数据结构,这不是一个选项,因为它是存储在现有数据库中的数据。我想你在我写答案时回答了。这个答案与我已经发布的答案有何不同?。。。您还更改了这里的数据结构,这不是一个选项,因为它是存储在现有数据库中的数据。我想您在我写答案时回答了。这是一个多么好的解决方案。它解决了这个问题,也解决了很多问题。这是一个多么好的解决方案。它解决了这一点和前面的许多问题。