Сортировать несколько повторяющихся значений в DataTable в одну строку - PullRequest
0 голосов
/ 01 февраля 2012

Я импортировал DataTable из базы данных SQL, используя SqlDataAdapter и метод Fill.

Мои данные выглядят так:

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 ]

1 голос
/ 02 февраля 2012

Спасибо за ваш подход!Я сам решил это сейчас.

Вот как я это сделал:

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);
}
0 голосов
/ 01 февраля 2012

Я думаю, что это также может быть решено в 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...