我从第三方收到一个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...
首先,我需要从这些数据中删除mykey1
和mykey2
,我应该可以使用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}
};
答案 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();