2010-08-05 17 views
25

Mam DataTable, który zwracaIEnumerable ciąg

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

chcę przekonwertować to do pojedynczej wartości ciągu, tj:

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

Jak mogę przepisać następujące czynności, aby uzyskać pojedynczy ciąg

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

Nie jest jasne - jakie dane są returnowane? Czy masz DataRows i kolumnę ID? Ponadto, nie ma zamieszania na przecinkach - czy to możliwe, że istnieją one w bazie danych i są już obecne, czy też należy je dodać? – Kobi

+0

Dziękuję wszystkim uprzejmy – user160677

+5

'Wybierz (x => x);' nie ma absolutnie żadnego sensu, szczególnie w twoim przypadku – abatishchev

Odpowiedz

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

Czy chcesz wywołać funkcję ToArray() w _values? –

+2

Najprostsze rozwiązanie, właśnie miałem odpowiedzieć, ale musisz dodać .ToArray() na _values. –

+0

Rzeczywiście. Odpowiedź zaktualizowana. –

2

Spróbuj tego:

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

Zapomniałeś separatora. a + separator + b –

+2

Nie jest wymagany separator przez OP – cjk

+3

+1, ale dlaczego oba kroki i wywołanie 'ToList'? Dlaczego nie po prostu '_tbl.AsEnumerable(). Wybierz (x => x) .Aggregate ((a, b) => a + b);'? –

8

Napisz metodę rozszerzenia takie jak

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

i zakładając wynik poprzedniego wyrażenia jest IEnumerable <String>, zadzwoń:

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

Przeprosiny za dodatki w tej metodzie rozszerzenia - jest to taka, której często używam do łączenia ze sobą ciągów pasujących do tego przypadku. –

+1

A dlaczego spadł - wiem, że są tam dodatkowe rzeczy, które mogą nie być potrzebne na to pytanie, ale to działa. –

+0

@Alex - framework ma string.Join, który może ci się przydać. Zobacz http://msdn.microsoft.com/en-us/library/57a79xd0.aspx –

-1

Można oszukać z tym:

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

Notatka ToArray() lub podobna jest wymagana, aby wymusić wykonanie kwerendy.

Inną opcją jest

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

@ Winston - Nie jest wymagany separator, ponownie przeczytaj pytanie. – cjk

+0

Druga opcja: 'String output = String.Concat (_tbl.AsEnumerable(). ToArray());' zrobiłby to samo, nie? (bez "Wybierz") –

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

Można użyć MoreLINQ przedłużenie

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

Miałem podobny problem z ogólnym Array rodzaju i rozwiązać go w następujący sposób

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

Pamiętaj, że połączenie OfType<object>() jest obowiązkowe.