2011-11-17 8 views
0

C'est ce que j'essaie d'accomplir. Je veux sélectionner seulement des valeurs distinctes de toutes les lignes dans la colonne [0]. Puis je veux obtenir toutes les valeurs distinctes de la colonne [2] et les grouper sur la colonne [0].Distinct Enumerable DataTable basé sur la colonne?

donc en gros j'ai obtenu un DataTable comme ceci:

Fruit|Apples 
Fruit|Pears 
Vegetables|Peas 
Vegetables|Carrots 

donc je veux faire un foreach sur les valeurs distinctes, donc j'Énumérer des fruits une fois, puis ramasser les pommes et les poires et les légumes une fois ramasser les pois et les carottes. Je le fais pour créer des volets d'accordéon, où je veux grouper mes résultats sous un en-tête, le code ci-dessous le fait, cependant, il crée deux volets de Fruit parce qu'il ne réalise pas qu'il est déjà fruit.

foreach (DataRow dtrow in dtTable.Rows) 
     { 
      string idRow = dtrow[0].ToString(); 
      AccordionPane currentPane = new AccordionPane(); 
      currentPane.ID = "AccordionPane" + Guid.NewGuid().ToString(); 
      currentPane.HeaderContainer.Controls.Add(new LiteralControl(dtrow[0].ToString())); 
      foreach(DataRow dtRow2 in dtTable.Rows) 
      { 
       if(dtRow2[0].ToString() == idRow) 
       { 
        currentPane.ContentContainer.Controls.Add(new LiteralControl(dtRow2[1].ToString())); 
       } 
      } 
      NavigateAccordion.Panes.Add(currentPane); 
     } 

Répondre

0

Vous pouvez accomplir cela facilement lorsque vous utilisez LINQ, voir par vous-même:

var groupedRows = from row in dtTable.Rows.AsEnumerable() 
        group row by row[0] into grouped 
        select grouped; 

foreach (var group in groupedRows) 
{ 
    currentPane = new AccordionPane(); 
    currentPane.HeaderContainer.Controls.Add(group.Key.ToString()); 

    foreach (var row in group) 
    { 
     currentPane.ContentContainer.Controls.Add(row[1].ToString()); 
    } 
} 

Ou si vous voulez coller avec votre approche actuelle non LINQ:

foreach (DataRow dtrow in dtTable.Rows) 
     { 
      bool skip = false; 

      foreach (var pane in NavigateAccordion.Panes) 
      { 
       if (pane.HeaderContainer.Controls[0].Text == dtRow[0].ToString()) 
       { 
        skip = true; 
        break; 
       } 
      } 

      if (!skip) 
      { 
       string idRow = dtrow[0].ToString(); 
       AccordionPane currentPane = new AccordionPane(); 
       currentPane.ID = "AccordionPane" + Guid.NewGuid().ToString(); 
       currentPane.HeaderContainer.Controls.Add(new LiteralControl(dtrow[0].ToString())); 
       foreach(DataRow dtRow2 in dtTable.Rows) 
       { 
        if(dtRow2[0].ToString() == idRow) 
        { 
         currentPane.ContentContainer.Controls.Add(new LiteralControl(dtRow2[1].ToString())); 
        } 
       } 
       NavigateAccordion.Panes.Add(currentPane); 
      } 
     } 
+0

lol je devrais ai dit je ne linq s'il vous plaît je vais donner un aller –

+1

@mike - juste curieux? pourquoi pas de linq? vous pouvez facilement créer une méthode similaire sans linq mais qui comprendra beaucoup de travail supplémentaire – Polity

+0

Je reçois ce message d'erreur Erreur Impossible de trouver une implémentation du modèle de requête pour le type de source 'System.Data.DataRowCollection'. 'GroupBy' n'a pas été trouvé. –

Questions connexes