2009-06-15 2 views
5

немного новичок вопрос. У меня есть цикл foreach, где я пытаюсь получить доступ к свойству объекта строки и назначить строку.ForEach String concat

foreach(row in Dataset) 
{ 
string finalName= row.name; 

} 

On каждом шаге мне нужно Concat свойство имени каждого Роу в finalName

\ Спасибо большое,

+0

На каком языке это? –

+1

На каком языке это? Это похоже на C#, но это может быть что-то другое. Вам нужно добавить какой-то разделитель между именами строк или willitbeareallylongnameintheininal? –

+0

@ Dillie-O отличный способ показать, почему разделитель может быть хорошей идеей, +1 – kastermester

ответ

22

В зависимости от требований к производительности вы можете CONCAT используя оператор сложения:

string finalName = string.Empty; 
foreach(row in Dataset) 
{ 
    finalName += row.name;  
} 

или использовать StringBuilder:

Stringbuilder sb = new StringBuilder(); 
foreach(row in Dataset) 
{ 
    sb.Append(row.Name); 
} 

string finalName = sb.ToString(); 

Общее для очень небольшого количества добавок вы не заметите разницы между двумя версиями. Но если вы комбинируете много строк, то при использовании StringBuilder может быть очень заметная производительность и память.

Также имейте в виду, что это поместит строки непосредственно друг за другом, чтобы вы могли также добавить пространство или новую строку между ними.


Специальный бонус LINQ один вкладыш:

Поскольку вы, кажется, знакомы с C# Я хотел бы предложить, что вы игнорируете этот, так как он является весьма прогрессивным и откровенно не читаемыми (но с другой стороны кто не любит бросать в свой код случайные бит LINQ?). Тем не менее, я добавлю его здесь для полноты. Я не знаю, что такое производительность, но одним из основных преимуществ над другими методами является легкость с вами, вы можете помещать пробел или другой символ между строками. Просто измените значение в отмеченной линии на то, что значение, которое вы хотите разделить объединенные строки с (Environment.NewLine или «», к примеру)

string finalName = string.Join(
       "", //Change the value here to separate the strings. 
       (from row in Dataset 
       select row.Name).ToArray()); 

или, если вы предпочитаете лямбды в LINQ:

string finalName = string.Join(
      "", //Change the value here to separate the strings. 
      Dataset.Select(row => row.Name).ToArray()); 
+0

Я уверен, что вы не хотите, чтобы в фишке было объявлено «finalName». –

+0

Вы правы. Исправлена. –

+0

@ Крис: Он объединяет данные через ROWS, а не COLUMNS. Тысячи записей в таблице обычны. –

1

Если вы действительно просто хотите Concat, то это все, что вам нужно ...

string finalName = ""; 

foreach(DataRow row in dataset.Tables[tablename].Rows) 
{ 
finalName += row.name; 

} 
1

Вот один ...

string finalName = "" 

foreach (DataRow row in dataSet.TableX) 
{ 
    finalName += row.Name; 
    finalName += Environment.NewLine; 
} 

Вот еще ...

StringBuilder finalName = new StringBuilder() 

foreach (DataRow row in dataSet.TableX) 
{ 
    finalName.Append(row.Name); 
    finalName.Append(Environment.NewLine); 
} 
3

Просто пару вещей ...

  1. DataSet «s не имеют строк, они DataTable с, и эти DataTable s имеют DataRows
  2. Вы можете использовать оператор += для выполнения конкатенации, хотя общий совет в том, что объект StringBuilder лучше подходит для этого fo r производительности и памяти.

Предполагая, что ваш DataSet имеет один DataTable и столбец вы после называется name, вы можете использовать любой из них (первый с помощью оператора +=, второй с помощью StringBuilder)

string finalName = string.Empty; 

foreach(DataRow row in dataSet.Tables[0].Rows) 
{ 
    finalName += row["name"].ToString(); 
} 

или

System.Text.StringBuilder builder = new System.Text.StringBuilder(); 

foreach(DataRow row in dataSet.Tables[0].Rows) 
{ 
    builder.Append(row["name"].ToString()); 
} 

string finalName = builder.ToString();