2010-08-05 24 views
25

Ho un DataTable che restituisceIEnumerable a stringa

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

voglio convertire questo singolo valore stringa, vale a dire:

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

come posso riscrivere la seguente per ottenere una singola stringa

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

Non è chiaro: quali dati vengono ripristinati? Avete DataRows e una colonna di ID? Inoltre, c'è confusione sulle virgole - è possibile che esistano nel database e che siano già presenti o dovresti aggiungerle? – Kobi

+0

Grazie a tutti i gentili di cuore – user160677

+5

'Seleziona (x => x);' non ha assolutamente senso, specialmente nel tuo caso – abatishchev

risposta

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

Hai bisogno di chiamare ToArray() su _valori? –

+2

La soluzione più semplice, stavo per rispondere, ma dovrai aggiungere .ToArray() su _values. –

+0

Infatti. Risposta aggiornata –

2

Prova questo:

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

Hai dimenticato il separatore. a + separatore + b –

+2

Non esiste un separatore richiesto dall'OP – cjk

+3

+1 ma perché i due passaggi e la chiamata a 'ToList'? Perché non solo '_tbl.AsEnumerable(). Select (x => x) .Aggregate ((a, b) => a + b);'? –

8

Scrivere un metodo di estensione, come

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(); 
    } 
} 

e assumendo il risultato della vostra espressione precedente è IEnumerable <String>, chiamare:

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

Scuse per gli extra in quel metodo di estensione - è uno che uso abbastanza spesso per unire insieme le stringhe che si adattano a questo caso. –

+1

E perché il downvote - so che ci sono cose extra che potrebbero non essere necessarie per la domanda, ma funziona. –

+0

@Alex - il framework ha string.Join, che potresti trovare utile. Vedere http://msdn.microsoft.com/en-us/library/57a79xd0.aspx –

-1

Si può imbrogliare con questo:

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

Nota È necessario ToArray() o simile per forzare l'esecuzione della query.

Un'altra opzione è

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

@ Winston - Non è richiesto alcun separatore, rileggere la domanda. – cjk

+0

Seconda opzione: 'String output = String.Concat (_tbl.AsEnumerable(). ToArray());' farebbe lo stesso, no? (senza 'Select') –

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

È possibile utilizzare MoreLINQ estensione

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

ho avuto un problema simile con generale Array tipo e ho risolto come segue

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

Nota che la chiamata OfType<object>() è obbligatoria.