我使用DataTable
和Fill-Method从SQL数据库导入了SqlDataAdapter
。
我的数据表看起来像这样:
Timestamp(unix time) | Value
x | 10
x | 42
x | 643
y | 5
y | 9
y | 70
......等等。该表包含许多值(1000+)但总是有三行具有相同的时间戳。
现在我希望它看起来像这样:
Timestamp(unix time) | Value 1 | Value 2 | Value 3
x | 10 | 42 | 643
y | 5 | 9 | 70
我怎样才能这样排序?
(如果有三个以上的值,程序应该只插入它找到的前三个值)
感谢您的帮助!
答案 0 :(得分:1)
谢谢你的方法!我现在自己解决了。
我就是这样做的:
var grouped = from myRow in myDataTable.AsEnumerable()
group myRow by myRow.Field<int>("TIMESTAMP");
foreach (var timestamp in grouped)
{
string[] myRow = new string[5];
myRow[0] = timestamp.Key.ToString();
int i = 1;
foreach (var value in timestamp)
{
myRow[i] = value.Field<double>("VALUE").ToString();
i++;
if (i > 4)
break;
}
mySortedTable.Rows.Add(myRow);
}
答案 1 :(得分:0)
我认为这在SQL中也可以解决,但是如果你想以编程方式进行,我在LinqPad中测试了以下内容:
void Main()
{
var list = new List<Tuple<string,int>> {
Tuple.Create("x", 10),
Tuple.Create("x", 42),
Tuple.Create("x", 643),
Tuple.Create("y", 5),
Tuple.Create("y", 9),
Tuple.Create("y", 70),
};
var result =
from grp in list.GroupBy(t => t.Item1)
let firstThree = grp.Select(t => t.Item2).Take(3).ToList()
select new {
Key = grp.Key,
Value1 = firstThree[0],
Value2 = firstThree[1],
Value3 = firstThree[2] };
foreach (var item in result)
Console.WriteLine(item);
}
它假设您有至少三个元素,否则您将超出范围异常。
虽然最终结果是匿名类型,但您可以轻松地将操作结果传输到DataRow中。