2016-05-15 18 views
1

Ich habe Liste von Tuple wie folgt aus:Group, sortieren Liste der Tuple mit Linq

List<Tuple<int,int, string>> list; 

Und mit ausgefüllten Werte:

1,200,"somelabelForHeaderA" 
2,200,"sometextA" 
3,200,"sometextA" 
4,222,"somelabelForHeaderB" 
5,222,"sometextB" 
6,222,"sometextB" 
7,300,"somelabelForHeaderC" 
8,300,"sometextC" 
9,401,"somelabelForHeaderD" 
10,401,"sometextD" 
11,401,"sometextD" 
12,401,"sometextD" 

jetzt, was ich tun möchte, ist Sortier- und Gruppierungs wie diese :

1,200,"somelabelForHeaderA" <== ***Must Be Inserted in Column 1 Row 1*** 
2,200,"sometextA sometextA" <== ***Must Be Inserted in Column 2 Row 1*** 
3,222,"somelabelForHeaderB" <== ***Must Be Inserted in Column 1 Row 2*** 
4,222,"sometextB sometextB" <== ***Must Be Inserted in Column 2 Row 2*** 
5,300,"somelabelForHeaderC" <== ***Must Be Inserted in Column 1 Row 3*** 
6,300,"sometextC"   <== ***Must Be Inserted in Column 2 Row 3*** 
7,401,"somelabelForHeaderD" <== ***Must Be Inserted in Column 1 Row 4*** 
8,401,"sometextD sometextD sometextD" <== ***Insert in Column 2 Row 4*** 

und dann jeden "somelabelForHeader" insert und "sometext" in einer Zeile.

das ist so weit ich gehen:

 var grouped = list.GroupBy(t => t.Item2, t => t.Item3) 
.Select(g => Tuple.Create(g.Key, string.Join("\n", g))); 

foreach (var groups in grouped) 
       { 
    using (SqlConnection sqlconnection = new SqlConnection(Connection_String)) 
       { 
        using (SqlCommand cmd = new SqlCommand()) 
        { 
         cmd.Connection = sqlconnection; 
         cmd.CommandType = CommandType.Text; 
         cmd.CommandText = query; 
         cmd.Parameters.AddWithValue("@a", groups.Item2); 
         cmd.Parameters.AddWithValue("@c", "???"); 
          try 
          { 
           sqlconnection.Open(); 
           cmd.ExecuteNonQuery(); 
          } 
          catch (SqlException ex) 
          { 

          } 

         } 
        } 

mit obigem Code i Gruppe und concat Alle Text kann aber wie kann erste Reihe vor dem Einsetzen sortieren und extrahieren?

Antwort

2

Sie können dies tun:

var query = Items 
    .GroupBy(i => i.Item2, i => i.Item3) 
    .SelectMany(g => new[] 
    { 
     new { b = g.Key, c = g.First() }, 
     new { b = g.Key, c = String.Join(" ", g.Skip(1)) }, 
    }) 
    .Select((x, i) => Tuple.Create(i + 1, x.b, x.c)); 

Der Schlüssel getrennte Reihen für den Header (das erste Element der Gruppe) und die Textteile (der Rest) zu schaffen. Von dort können Sie die neuen Zähler erzeugen, um Ihre letzten Tupel zu erstellen.

0

Versuchen Sie, diese

var grouped = list.GroupBy(t => t.Item2) 
.Select(g => Tuple.Create(g.Key,g.Max(i=>i.Item3),g.Min(i=>i.Item3),g.Count()));