是否有LINQ等效的string.Join(string,string [])

时间:2009-06-01 12:34:21

标签: c# .net linq linq-to-sql

有没有办法使用LINQ将对象集合转换为单个新对象?

我想在另一个LINQ to SQL表达式中使用它。

4 个答案:

答案 0 :(得分:23)

为什么不使用string.Join本身?

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

答案 1 :(得分:13)

您可以使用聚合方法......

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

答案 2 :(得分:7)

通常的方法是使用其中一个聚合运算符(AggregateSumAverage等),但这完全取决于类型和您想要做的事情。你对什么类型感兴趣?

编辑:好的,所以你想要连接字符串...我不在LINQ to SQL本身就有这样的东西。选项:

  • 编写存储过程或TVF以在SQL
  • 中执行此操作
  • 在LINQ to SQL中获取单个字符串并在客户端连接

答案 3 :(得分:4)

如果你想要连接大量的值,那么这里的大多数解决方案都是相当低效的。而且,它们并非完全可读。如果你经常要做这种事情,那么建立你自己的扩展方法是值得的。下面的实现允许您执行相当于string.Join(", ", arrayOfStrings)的数组,其中arrayOfStrings可以是IEnumerable<T>,而分隔符可以是任何对象。它允许你做这样的事情:

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

我喜欢这两件事:

  1. 它在LINQ环境中非常易读。
  2. 它非常有效,因为它使用StringBuilder并避免两次计算枚举,这在数据库场景(L2S,L2E或L2Nh)中很重要。
  3. 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(); 
    }