Есть ли LINQ эквивалент string.Join(string, string [])

Есть ли способ конвертировать коллекцию объектов в один новый объект с помощью LINQ?

Я хочу использовать это в другом выражении LINQ to SQL.

Ответ 1

Почему бы вам не использовать string.Join?

string.Join("<br/>", collection.Select(e => e.TextProp).ToArray());

Ответ 2

Вы можете использовать метод Aggregate...

var myResults = (from myString in MyStrings
                 select myString)
                .Aggregate(string.Empty, (results, nextString) 
                   => string.Format("{0}<br />{1}", results, nextString));

или

var myResults = MyStrings.Aggregate(string.Empty, (results, nextString) 
                   => string.Format("{0}<br />{1}", results, nextString));

Ответ 3

Обычным способом было бы использовать один из операторов агрегации (Aggregate, Sum, Average и т.д.), но он полностью зависит от типа и того, что вы хотите сделать. Какой тип вас интересует?

EDIT: Хорошо, так что вы хотите объединить строки... Я не думаю, что что-то будет в LINQ to SQL. Параметры:

  • Напишите сохраненную proc или TVF, чтобы сделать это в SQL
  • Получить отдельные строки в LINQ to SQL и объединить их на стороне клиента

Ответ 4

Большинство решений здесь довольно неэффективны, если у вас есть большое количество значений, которые вы хотите контактировать. Кроме того, они не все настолько читаемы. Если вы собираетесь делать такие вещи часто, то стоит создать свой собственный метод расширения, чтобы сделать это. Нижеприведенная реализация позволяет сделать эквивалент string.Join(", ", arrayOfStrings), где arrayOfStrings может быть IEnumerable<T>, а разделителем может быть любой объект вообще. Это позволяет вам сделать что-то вроде этого:

var names = new [] { "Fred", "Barney", "Wilma", "Betty" };
var list = names
    .Where(n => n.Contains("e"))
    .Join(", ");

Мне нравятся две вещи:

  • Он очень читается в контексте LINQ.
  • Это довольно эффективно, поскольку использует StringBuilder и позволяет избежать повторной оценки перечисления, что важно в сценарии базы данных (L2S, L2E или L2Nh).
public static string Join<TItem,TSep>( 
    this IEnumerable<TItem> enuml, 
    TSep                    separator) 
{ 
    if (null == enuml) return string.Empty; 

    var sb = new StringBuilder(); 

    using (var enumr = enuml.GetEnumerator()) 
    { 
        if (null != enumr && enumr.MoveNext()) 
        { 
            sb.Append(enumr.Current); 
            while (enumr.MoveNext()) 
            { 
                sb.Append(separator).Append(enumr.Current); 
            } 
        } 
    } 

    return sb.ToString(); 
}