2010-08-26 3 views
7

J'ai un datatable avec quelques lignes chaque rangée a peu de colonnes.
Je veux créer un arraylist qui countain toute la ligne comme une chaîne
de sorte que chaque élément du tableau ressemble à ce {1;qwqww;qweqweqwe;qweqweqw;qwe}
Les éléments de la chaîne seront séparées par une ; et il est une solution .NET 2C#, DataTable à ArrayList?

Merci

+0

toutes les colonnes contenir des chaînes? – thelost

+0

oui (un est booléen) mais il sera utilisé comme "vrai" "faux" –

+0

[Ne le faites pas!] (Http://stackoverflow.com/questions/434414/what-is-the-most-evil -code-vous-avez-jamais-vu-dans-un-environnement-de-production-production/434562 # 434562) –

Répondre

10

Voici une solution qui fonctionne réellement.

ArrayList rows = new ArrayList(); 

foreach (DataRow dataRow in myDataTable.Rows) 
    rows.Add(string.Join(";", dataRow.ItemArray.Select(item => item.ToString()))); 

Cependant, je sens que je tiens à souligner qu'il est imprudent d'utiliser le ArrayList obsolète. Utilisez plutôt List<string>, car les lignes sont des chaînes:

List<string> rows = new List<string>(); 

Le reste du code est le même.

+1

Merci, mais dataRow.ItemArray.Select (item => item.ToString) ne fonctionne pas pour moi! J'utilise .NET v2 y at-il quelque chose à voir avec ça? –

+0

Je reçois "Impossible de résoudre le symbole Sélectionnez" !!! –

+0

@ Data-Base: Ajoutez 'using System.Linq;' en haut du fichier. – Timwi

1

Au lieu d'utiliser un ArrayList je vous recommande d'utiliser une collection fortement typée car un ArrayList n'apporterait pas beaucoup de valeur par rapport à un DataTable non fortement typé. Ainsi, vous pouvez commencer par définir un modèle qui représentera chaque ligne:

public class MyModel 
{ 
    public int Id { get; set; } 
    public string Prop1 { get; set; } 
    public string Prop2 { get; set; } 
} 

boucle puis sur votre DataTable et remplir la collection:

List<MyModel> models = new List<MyModel>(); 
foreach (DataRow row in dt.Rows) 
{ 
    MyModel model = new MyModel 
    { 
     Id = (int)row[0], 
     Prop1 = (string)row[1], 
     Prop2 = (string)row[2] 
    }; 
    models.Add(model); 
} 

Ou vous pouvez utiliser LINQ si vous préférez:

List<MyModel> models = dt.Rows 
    .Cast<DataRow>() 
    .Select(row => new MyModel { 
     Id = (int)row[0], 
     Prop1 = (string)row[1], 
     Prop2 = (string)row[2] 
    }) 
    .ToList(); 
+0

Nice, mais que faire si les lignes dans le datatable variait et n'était pas toujours 3? – w69rdy

-2
ArrayList aList = new ArrayList(dt.Rows.Count); 
foreach (DataRow row in dt.Rows) 
{ 
    aList.Add(row); 
} 
+0

comment les éléments seront séparés dans la chaîne? est-ce par "," ou ";"? –

+0

Ne fonctionne pas, il veut chaque élément de tableau comme une seule chaîne, pas un datarow – w69rdy

+0

oh .. J'ai raté ce fait dans sa question! –

1
ArrayList rows = new ArrayList(); 

foreach (DataRow dataRow in ((DataTable)dataGrid.DataSource).Rows) 
{ 
    rows.Add(String.Join(";", (string[])dataRow.ItemArray)); 
} 
+0

vous voulez dire ";" et non "," dans rows.Add (String.Join (",", (string []) dataRow.ItemArray)); ? –

+0

Je soupçonne que le cast à 'string []' échouera généralement. – Timwi

+0

@ Data-Base - oui, réparé, merci! @Timwi - J'ai demandé ce que le type d'éléments de tableau serait, il semble qu'il attend seulement la chaîne – thelost

0

Voilà ma théorie: Ce est un fragment de code que j'utilise pour écrire un fichier CSV pour une datatable:

foreach (DataRow row in table.Rows) 
{ 
    for (int i = 0; i < table.Columns.Count; i++) 
    { 
     WriteItem(stream, row[i], quoteall); 
     if (i < table.Columns.Count - 1) 
      stream.Write(','); 
     else 
      stream.Write('\n'); 
    } 
} 

Utilisation StringBuffer au lieu de WriteItem ... flux etc ...

+0

Merci d'avoir corrigé cela, je vais trouver comment mettre le code correctement – MikeAinOz