如何在C#中透视后创建两个dim数组

时间:2016-12-25 16:18:10

标签: c# linq pivot

我从第三方收到一个Json doc,在反序列化时,我有一个以下格式的动态对象列表

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子句来执行此操作

.Where(w => (string)w.key != "mykey1" && (string)w.key != "mykey2")

完成后,我需要使用列作为键(按0到5排序然后字符串“> 5”)来旋转数据,并获取值的二维数组int[,]。这个我不知道如何!

因此结果可能类似于以下内容。

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}
                      };

2 个答案:

答案 0 :(得分:4)

我想你想要这样的东西:

<?php
define('DB_USER','root');
define('DB_NAME','shitsandgarbage');
define('DB_PASS','');
define('DB_HOST','localhost');

$link = mysql_connect(DB_HOST, DB_USER, DB_PASS);
if(!$link){
    die('Unable to connect your host: '.mysql_error());
}
$thedb = mysql_select_db(DB_NAME,$link);
if(!$thedb){
    die('Cannot find your database: '.mysql_error());
}
$email = $_POST['email'];
$password = $_POST['password'];

$sqlemail = "INSERT INTO a (email) VALUES ('$email')";
$sqlpass = "INSERT INTO a (password) VALUES ('$password')";

mysql_close();
?>
<!DOCTYPE html>
<html>
<form action="index.php" method="post">
    <input type="email" name="email" placeholder="Usename/Email">
    <input type="password" name="password" placeholder="Password">
    <input type="submit" value="Login">
    </form>
</html>

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

动态版可以是这样的:

{ 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 }
...

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

修改:

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

答案 1 :(得分:1)

我怀疑这个效率,但它适用于period的任意数量的项目。您还可以使用int[][]代替int[,]

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