2010-08-05 14 views
25

tengo un DataTable que devuelveIEnumerable a cadena

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

Quiero convertir esto en valor de cadena única, es decir:

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

¿Cómo puedo volver a escribir lo siguiente para obtener una única cadena

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

No está claro, ¿qué datos se retiró? ¿Tiene DataRows y una columna de ID? Además, existe confusión sobre las comas: ¿es posible que existan en la base de datos y que ya estén presentes o deberían agregarse? – Kobi

+0

Gracias a todos los amables – user160677

+5

'Seleccionar (x => x);' no tiene ningún sentido, especialmente en su caso – abatishchev

Respuesta

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

¿Necesita llamar a ToArray() en _valores? –

+2

La solución más simple, estaba a punto de responder, pero tendrá que agregar .ToArray() en _valores. –

+0

De hecho. Respuesta actualizada –

2

Prueba esto:

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

Olvidó el separador. a + separator + b –

+2

No hay separador requerido por el OP – cjk

+3

+1, pero ¿por qué los dos pasos y llaman a 'ToList'? ¿Por qué no simplemente '_tbl.AsEnumerable(). Select (x => x) .Aggregate ((a, b) => a + b);'? –

8

escribir un método de extensión como

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

y suponiendo que el resultado de la expresión anterior es IEnumerable <cadena>, llame a:

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

Disculpas por los extras en ese método de extensión, es uno que utilizo bastante a menudo para unir cadenas que se adapte a este caso. –

+1

Y por qué el voto a favor - Sé que hay cosas adicionales allí que pueden no ser necesarias para la pregunta, pero funciona. –

+0

@Alex - el marco tiene string.Join, que puede serle útil. Ver http://msdn.microsoft.com/en-us/library/57a79xd0.aspx –

-1

Usted puede engañar con esto:

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

Nota ToArray() o similar es necesario para forzar la ejecución de la consulta.

Otra opción es

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

@ Winston - No se requiere separador, vuelva a leer la pregunta. – cjk

+0

Segunda opción: 'String output = String.Concat (_tbl.AsEnumerable(). ToArray());' haría lo mismo, ¿no? (sin el 'Seleccionar') –

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

Usted puede utilizar MoreLINQ extensión

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

tuve un problema similar con el general Array tipo y lo resolví de la siguiente manera

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

Tenga en cuenta que la llamada OfType<object>() es obligatoria.

Cuestiones relacionadas