将DataTable中的多个重复值排序为一行

时间:2012-02-01 09:20:35

标签: c# sorting datatable

我使用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

我怎样才能这样排序?

(如果有三个以上的值,程序应该只插入它找到的前三个值)

感谢您的帮助!

2 个答案:

答案 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中。