【问题标题】:Count across multiple columns in LINQ在 LINQ 中计算多个列
【发布时间】:2018-02-01 23:47:32
【问题描述】:

我知道这个问题的最佳答案是更好和优化的数据库,但是否可以在当前结构上优化这个总和?

表格是这样的:

rowid a1 b1 b2 b3
123   s  s  n  s
124   n  n  n  n
125   s  n  s  s

我需要计算所有“s”的个数。

var items = AsDynamic(App.Data["items"]).Where(p => Convert.ToDateTime(p.data).Year == ano);

var items_1a = items.Where(u => u.udd == "_1a");

var items_1a_jan = items_1a.Where(m => Convert.ToDateTime(m.data).Month == 1);

int items_1a_jan_s = items_1a_jan.Count(q => q.a1 == "s") + items_1a_jan.Count(q => q.b1 == "s") + items_1a_jan.Count(q => q.b2 == "s") + items_1a_jan.Count(q => q.b3 == "s") + items_1a_jan.Count(q => q.b4 == "s") + items_1a_jan.Count(q => q.b5 == "s") + items_1a_jan.Count(q => q.b6 == "s") + items_1a_jan.Count(q => q.b7 == "s") + items_1a_jan.Count(q => q.b8 == "s") + items_1a_jan.Count(q => q.b9 == "s") + items_1a_jan.Count(q => q.b10 == "s") + items_1a_jan.Count(q => q.b11 == "s") + items_1a_jan.Count(q => q.b12 == "s") + items_1a_jan.Count(q => q.b13 == "s") + items_1a_jan.Count(q => q.c1 == "s") + items_1a_jan.Count(q => q.c2 == "s") + items_1a_jan.Count(q => q.c3 == "s") + items_1a_jan.Count(q => q.c4 == "s") + items_1a_jan.Count(q => q.c5 == "s") + items_1a_jan.Count(q => q.c6 == "s") + items_1a_jan.Count(q => q.c7 == "s") + items_1a_jan.Count(q => q.c8 == "s") + items_1a_jan.Count(q => q.c9 == "s") + items_1a_jan.Count(q => q.c10 == "s") + items_1a_jan.Count(q => q.c11 == "s") + items_1a_jan.Count(q => q.c12 == "s") + items_1a_jan.Count(q => q.c13 == "s") + items_1a_jan.Count(q => q.c14 == "s") + items_1a_jan.Count(q => q.c15 == "s") + items_1a_jan.Count(q => q.c16 == "s") + items_1a_jan.Count(q => q.c17 == "s") + items_1a_jan.Count(q => q.d1 == "s") + items_1a_jan.Count(q => q.d2 == "s") + items_1a_jan.Count(q => q.d3 == "s") + items_1a_jan.Count(q => q.d4 == "s") + items_1a_jan.Count(q => q.d5 == "s") + items_1a_jan.Count(q => q.d6 == "s") + items_1a_jan.Count(q => q.d7 == "s") + items_1a_jan.Count(q => q.d8 == "s") + items_1a_jan.Count(q => q.d9 == "s") + items_1a_jan.Count(q => q.e1 == "s") + items_1a_jan.Count(q => q.e2 == "s") + items_1a_jan.Count(q => q.e3 == "s") + items_1a_jan.Count(q => q.e4 == "s") + items_1a_jan.Count(q => q.e5 == "s") + items_1a_jan.Count(q => q.e6 == "s") + items_1a_jan.Count(q => q.e7 == "s") + items_1a_jan.Count(q => q.e8 == "s") + items_1a_jan.Count(q => q.e9 == "s") + items_1a_jan.Count(q => q.e10 == "s") + items_1a_jan.Count(q => q.e11 == "s");

【问题讨论】:

标签: c# linq


【解决方案1】:

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

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

【讨论】:

  • 多么棒的解决方案。它解决了这个问题以及未来的许多问题。
【解决方案2】:

如果你真的有这么多领域并且需要在所有领域中计数,那么你可以使用反射:

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

【讨论】:

    【解决方案3】:

    我不确定您存储数据的确切方式,但您可以执行以下操作:

    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');
    

    【讨论】:

    • 这个答案与我已经发布的答案有何不同?...您还更改了此处的数据结构,这不是一个选项,因为它是存储在现有数据库中的数据..
    • 我想你在我写答案的时候回答了。
    猜你喜欢
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 2015-08-25
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    相关资源
    最近更新 更多