2010-08-05 8 views
25

J'ai un DataTable qui retourneIEnumerable chaîne

IDs 
,1 
,2 
,3 
,4 
,5 
,100 
,101 

Je veux convertir en valeur de chaîne unique, à savoir:

,1,2,3,4,5,100,101 

Comment puis-je réécrire ce qui suit pour obtenir une seule chaîne

var _values = _tbl.AsEnumerable().Select(x => x); 
+2

Il n'est pas clair - quelles sont les données qui sont retournées? Avez-vous des DataRows et une colonne d'ID? En outre, il y a confusion au sujet des virgules - est-il possible qu'elles existent dans la base de données et sont déjà présentes, ou devriez-vous les ajouter? – Kobi

+0

Merci à tous généreux – user160677

+5

'Select (x => x);' n'a absolument aucun sens, surtout dans votre cas – abatishchev

Répondre

64
var singleString = string.Join(",", _values.ToArray()); 
+1

Avez-vous besoin d'appeler ToArray() sur _values? –

+2

La solution la plus simple, j'étais sur le point de répondre, mais vous devrez ajouter .ToArray() sur _values. –

+0

En effet. Réponse mise à jour –

2

Essayez ceci:

var _values = _tbl.AsEnumerable().Select(x => x); 
string valueString = _values.ToList().Aggregate((a, b) => a + b); 
+0

Vous avez oublié le séparateur. a + séparateur + b –

+2

Il n'y a pas de séparateur requis par l'OP – cjk

+3

+ 1, mais pourquoi les deux étapes et appeler 'ToList'? Pourquoi ne pas simplement '_tbl.AsEnumerable(). Sélectionnez (x => x) .Aggregate ((a, b) => a + b);'? –

8

Ecrire une méthode d'extension telle que

public static String AppendAll(this IEnumerable<String> collection, String seperator) 
{ 
    using (var enumerator = collection.GetEnumerator()) 
    { 
     if (!enumerator.MoveNext()) 
     { 
      return String.Empty; 
     } 

     var builder = new StringBuilder().Append(enumerator.Current); 

     while (enumerator.MoveNext()) 
     { 
      builder.Append(seperator).Append(enumerator.Current); 
     } 

     return builder.ToString(); 
    } 
} 

et en supposant que le résultat de votre expression précédente est IEnumerable < chaîne >, appelez:

var _values = _tbl.AsEnumerable().Select(x => x).AppendAll(String.Empty);  
+0

Toutes mes excuses pour les extras dans cette méthode d'extension - c'est un que j'utilise assez souvent pour joindre des chaînes qui conviennent à ce cas. –

+1

Et pourquoi le downvote - Je sais qu'il y a des trucs supplémentaires qui ne sont peut-être pas nécessaires pour la question, mais ça marche. –

+0

@Alex - le framework a string.Join, que vous pourriez trouver utile. Voir http://msdn.microsoft.com/en-us/library/57a79xd0.aspx –

-1

Vous pouvez tricher avec ceci:

String output = ""; 
_tbl.AsEnumerable().Select(x => output += x).ToArray(); 
// output now contains concatenated string 

Remarque ToArray() ou similaire est nécessaire pour forcer l'exécution de la requête.

Une autre option est

String output = String.Concat(_tbl.AsEnumerable().Select(x=>x).ToArray()); 
+0

@Winston - Il n'y a pas de séparateur requis, relisez la question. – cjk

+0

Deuxième option: 'String output = String.Concat (_tbl.AsEnumerable(). ToArray());' ferait la même chose, non? (sans le 'Select') –

4
String.Join(
     ",", 
     _tbl.AsEnumerable() 
      .Select(r => r.Field<int>("ID").ToString()) 
      .ToArray()) 
2

Vous pouvez utiliser MoreLINQ l'extension

var singleString = _values.ToDelimitedString(","); 
1

J'ai eu un problème similaire avec le type général Array et je l'ai résolu comme suit

string GetMembersAsString(Array array) 
{ 
    return string.Join(",", array.OfType<object>()); 
} 

Notez que l'appel OfType<object>() est obligatoire.