首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在C#中的枢轴之后创建两个模糊数组

如何在C#中的枢轴之后创建两个模糊数组
EN

Stack Overflow用户
提问于 2016-12-25 16:18:09
回答 2查看 315关注 0票数 1

我收到一个来自第三方的Json文档,当反序列化时,我有一个如下格式的动态对象列表

代码语言:javascript
复制
period       key          val
"2013-3"     0            5
"2013-3"     1            6
"2013-3"     2            5  
"2013-3"     3            6
"2013-3"     4            15
"2013-3"     5            25
"2013-3"     ">5"         55
"2013-3"    "mykey1"      25
"2013-3"    "mykey2"       6
"2013-4"     0            15
"2013-4"     1            16
"2013-4"     2            25  
"2013-4"     3            36
 and so on...

首先,我需要从这些数据中删除mykey1mykey2,我应该能够使用LinQ中的where子句来完成这些操作。

代码语言:javascript
复制
.Where(w => (string)w.key != "mykey1" && (string)w.key != "mykey2")

完成后,我需要以列作为键(排序为0到5,然后字符串">5"),并获得值的二维数组int[,]。我一点也不知道怎么做!

因此,其结果可能类似于以下情况。

代码语言:javascript
复制
int[,] activities= { 
                      {5,6,5,6,15,25,55},
                      {15,16,25,36,21,22,23},
                      {31,32,33,34,31,32,33},
                      {41,42,43,44,41,42,43},
                      {11,12,13,14,11,12,13},
                      {21,22,23,24,21,22,23},
                      {31,32,33,34,31,32,33},
                      {41,42,43,44,41,42,43},
                      {11,12,13,14,11,12,13},
                      {21,22,23,24,21,22,23},
                      {31,32,33,34,31,32,33},
                      {41,42,43,44,41,42,43}
                      };
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-25 16:39:25

我想你想要这样的东西:

代码语言:javascript
复制
var result = list.GroupBy(g => g.period).Select(c => new
        {
            period = c.Key,
            s0 = c.Sum(f=> f.key.ToString() == "0" ? f.val : 0),
            s1 = c.Sum(f=> f.key.ToString() == "1" ? f.val : 0),
            s2 = c.Sum(f=> f.key.ToString() == "2" ? f.val : 0),
            s3 = c.Sum(f=> f.key.ToString() == "3" ? f.val : 0),
            s4 = c.Sum(f=> f.key.ToString() == "4" ? f.val : 0),
            s5 = c.Sum(f=> f.key.ToString() == "5" ? f.val : 0),
            s6 = c.Sum(f=> f.key.ToString() == ">5" ? f.val : 0),
        })
        .ToList();

result将是这样的:

代码语言:javascript
复制
{ period = "2013-3", s0 = 5,  s1 = 6,  s2 = 5,  s3 = 6,  s4 = 15, s5 = 25, s6 = 55 }
{ period = "2013-4", s0 = 15, s1 = 16, s2 = 25, s3 = 36, s4 = 21, s5 = 22, s6 = 23 }
...

动态版本可以是这样的:

代码语言:javascript
复制
var result = list.GroupBy(g => g.period)
             .ToDictionary(k => k.Key, l =>
                list.Where(w => w.period == l.Key)
                    .GroupBy(k => k.key.ToString())
                    .OrderBy(o => o.Key)
                    .Select(s => s.Sum(f => f.val)));

它返回句点键的字典和基于它们的键的求和值列表;)。

编辑:

代码语言:javascript
复制
var result = list.GroupBy(g => g.period)
            .Select(l =>
                list.Where(w => w.period == l.Key && !w.key.In(new[] {"myKey1", "myKey2"}))
                    .GroupBy(k => k.key == ">5" ? "6" : k.key.ToString())
                    .OrderBy(o => o.Key)
                    .Select(s => s.Sum(f => f.val))
                    .ToArray())
            .ToArray();
票数 4
EN

Stack Overflow用户

发布于 2016-12-25 16:56:01

我怀疑这样做的效率,但它适用于每个period中的任意数量的项目。另外,您可以得到一个int[][]而不是int[,]

代码语言:javascript
复制
var periods = list.Select(w => w.period.ToString()).Distinct().ToList();
List<int[]> matrix = new List<int[]>(periods.Count());

foreach(string p in periods) 
{
    matrix.Add(list.Where(w => w.period.ToString().Equals(p)
                   .Select(w => (int)w.val))
                   .ToArray());
}

int[][] arrays = matrix.ToArray();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41322712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档