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

Mat*_*ser 15 .net c# linq linq-to-sql

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

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

bru*_*nde 24

你为什么不用string.Join它自己?

string.Join("<br/>", collection.Select(e => e.TextProp).ToArray());
Run Code Online (Sandbox Code Playgroud)

  • 问题是我怀疑它会被翻译成SQL.也许它会 - 但我怀疑它.如果它有效,我很高兴完全删除我的答案:) (5认同)
  • 在使用linqpad进行快速测试后,我认为这不会被转换为SQL.如果OP需要翻译,我认为他应该选择像你或Marc建议的存储过程. (2认同)

Sco*_*vey 14

您可以使用Aggregate方法......

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

要么

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

  • 这适用于可枚举的字符串,但在LINQ to SQL中似乎不支持(OP写道他希望在另一个LINQ to SQL表达式中使用它):它抛出NotSupportedException并显示消息"不支持查询运算符'Aggregate' ". (4认同)

Jon*_*eet 7

正常的方法是使用聚合运营商(之一Aggregate,Sum,Average等),但它完全取决于类型和你想要做什么.你对什么类型感兴趣?

编辑:好的,所以你想连接字符串...我不认为在LINQ to SQL本身有任何东西可以做到这一点.选项:

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

  • 只是让人们知道使用自定义聚合函数在 LINQ to ENTITIES 中有效,但在 LINQ to SQL 中无效。表值函数在两者中都不起作用。我能想出的唯一解决方法是创建一个视图。 (2认同)

Dam*_*ell 7

如果您有大量要连接的值,这里的大多数解决方案都相当低效。此外,它们并不是那么易读。如果你要经常做这种事情,那么构建你自己的扩展方法来做到这一点是值得的。下面的实现允许你做相当于string.Join(", ", arrayOfStrings)arrayOfStrings 可以是 an 的地方IEnumerable<T>,而分隔符可以是任何对象。它允许你做这样的事情:

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

我喜欢这个的两件事是:

  1. 它在 LINQ 上下文中非常易读。
  2. 它相当有效,因为它使用 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(); 
}
Run Code Online (Sandbox Code Playgroud)