【问题标题】:Is there a LINQ equivalent of string.Join(string, string[]) [duplicate]是否有 LINQ 等效的 string.Join(string, string[]) [重复]
【发布时间】:2009-06-01 12:34:21
【问题描述】:

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

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

【问题讨论】:

  • 有效地今天早些时候提出了这个问题 (stackoverflow.com/questions/934327) - 从那时起 LINQ 就没有改变
  • @Marc Gravell 谢谢。我知道 LINQ 在过去一个小时左右没有改变,我只是想弄清楚如何进行连接。
  • @Marc Gravell 对 (stackoverflow.com/questions/934327) 的回答和@Jon Skeet 在下面的回答是正确的。 @bruno conde 和 @Scott Ivey 的回答不正确。因此,您应该将@Jon Skeet 的答案标记为已接受的答案。
  • 另一个问题几乎完全今天被问到了。世界将走向何方? stackoverflow.com/questions/993534

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


【解决方案1】:

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

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

【讨论】:

  • 问题是我怀疑它会被翻译成SQL。也许会——但我对此表示怀疑。如果可行,我很高兴完全删除我的答案:)
  • 在使用 linqpad 进行快速测试后,我认为这不会转换为 SQL。如果 OP 需要翻译这个,我认为他应该像你或 Marc 建议的那样选择存储过程。
  • 该死我怎么没看到这个。我构建了自己的扩展方法来完成这一切。
  • 很好的答案,你不需要调用 ToArray() 因为 Join() 可以接受一个枚举。
【解决方案2】:

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

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

【讨论】:

  • 这适用于可枚举的字符串,但似乎在 LINQ to SQL 中不受支持(OP 写道,他想在另一个 LINQ to SQL 表达式中使用它):它抛出 NotSupportedException 并显示消息“The不支持查询运算符“聚合”。”
【解决方案3】:

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

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

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

【讨论】:

  • 它是字符串,我想使用分隔符字符串进行附加,例如"、" 或 "
    "。
  • @ OP。如果您只是附加字符串,为什么不使用 StringBuilder?
  • @Jon OT 但是你能看一下问题 926352.. 你能把我理解的松散端收起来吗?
  • 人们知道使用自定义聚合函数在 LINQ to ENTITIES 中有效,但在 LINQ to SQL 中无效。表值函数在两者中都不起作用。我能想到的唯一解决方法是创建一个视图。
【解决方案4】:

如果您要连接大量值,则此处的大多数解决方案都相当低效。此外,它们并不是那么可读。如果你要经常做这种事情,那么构建你自己的扩展方法来做这件事是值得的。下面的实现允许您执行与string.Join(", ", arrayOfStrings) 等效的操作,其中arrayOfStrings 可以是IEnumerable&lt;T&gt;,分隔符可以是任何对象。它允许您执行以下操作:

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

我喜欢这个的两点是:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-11
    • 1970-01-01
    • 1970-01-01
    • 2013-08-16
    • 1970-01-01
    • 2014-05-20
    • 2010-10-04
    • 2011-06-14
    相关资源
    最近更新 更多