Как агрегировать IEnumerable <string>в строку, используя функцию Linq Aggregate - PullRequest
0 голосов
/ 22 июня 2011

У меня есть Ienumerable<string> коллекция, которую я хочу объединить в одну строку с разделителем;

например {"Один", "Два", "Три"} -> "Один; Два; Три;"

можно ли использовать следующую функцию?

List<string> list = new List<string>(){"One","Two","Three"};
list.Aggregate<String>((x,y) => x + String.Format("{0};",y));

Я пробовал также этот код:

list.Aggregate<String>((x,y) => String.Format("{0};{1}",x,y)); 

оба образца не работали.

РЕДАКТИРОВАТЬ: я вижу, что невозможно сделать то, что я хотел, используя Linq-2-sql или функцию Aggregate в Linq-2-sql.

http://social.msdn.microsoft.com/forums/en-US/linqprojectgeneral/thread/dac496c0-5b37-43ba-a499-bb8eff178706/

EDIT2: я использовал обходной путь, чтобы просмотреть элементы, возвращенные исходным запросом linq ... и скопировать их в новый список, и выполнить объединение, как предлагается в ответах ниже, для объекта linq, а не linq-2 -sql объект.

Ответы [ 3 ]

4 голосов
/ 22 июня 2011

Вы можете просто использовать String.Join для этого. Если вы используете .NET4, вы можете использовать перегрузку, которая принимает IEnumerable<string> напрямую:

string joined = string.Join(";", list);

Если вы используете более старую версию фреймворка, вам нужно будет использовать перегрузку, которая вместо этого принимает string[] массив , сначала преобразовывая вашу коллекцию в массив, если необходимо: *

string joined = string.Join(";", list.ToArray());

EDIT ...

Конечно, если вы действительно хотите по какой-то причине использовать Aggregate, тогда вас ничто не остановит. Если это так, обычно рекомендуется создавать вашу строку, используя StringBuilder, а не несколько строковых распределений:

string joined = list.Aggregate(new StringBuilder(),
                               (sb, s) => sb.Append(s).Append(';'),
                               sb => (sb.Length > 0) ? sb.ToString(0, sb.Length - 1)
                                                     : "");
1 голос
/ 23 апреля 2014

Вы можете сделать это, используя код ниже

list.Aggregate((i, j) => i + ";" + j);
1 голос
/ 22 июня 2011

Вам потребуется предоставить инициализатор, иначе к первому элементу не будет добавлен ;:

list.Aggregate<String>("", (x,y) => x + String.Format("{0};",y));
...