Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 汇总列表<;int>;使用(i,j)=>;i+&引用;分隔符+;J_C#_Linq - Fatal编程技术网

C# 汇总列表<;int>;使用(i,j)=>;i+&引用;分隔符+;J

C# 汇总列表<;int>;使用(i,j)=>;i+&引用;分隔符+;J,c#,linq,C#,Linq,我将在Linq(C#)中快速执行类似Haskell的聚合,以将列表转换为格式为“I^j^k…”的字符串 这在一个查询中是可能的,还是我应该按照旧的方式进行 foreach (int i in list) { string+= i + "^" } (注意:是的,这是伪代码,无法编译。)使用: 在这种特殊情况下,直接使用StringBuilder可能更有效,因为Append(int)可以避免创建临时字符串。但是,除非这成为一个瓶颈,否则我将坚持使用这个简单的单一表达式。在这里使用Stri

我将在Linq(C#)中快速执行类似Haskell的聚合,以将列表转换为格式为“I^j^k…”的字符串

这在一个查询中是可能的,还是我应该按照旧的方式进行

foreach (int i in list)
{
     string+= i + "^"
}
(注意:是的,这是伪代码,无法编译。)

使用:


在这种特殊情况下,直接使用
StringBuilder
可能更有效,因为
Append(int)
可以避免创建临时字符串。但是,除非这成为一个瓶颈,否则我将坚持使用这个简单的单一表达式。

在这里使用StringBuilder实例更有效。

在LINQ中肯定是可能的(请参阅其他语法答案)

但是,您可以考虑使用StrugBu建器代替。

StringBuilder sb=新建StringBuilder()
foreach(列表中的int i)sb.Append(i.ToString())

在您的情况下,更好的方法是:

String.Join(“^”,list.ToArray())


它使用StringBuilder完成相同的工作。

您可以使用聚合扩展:

string s = list.Aggregate<int, string>(String.Empty, (x, y) => (x.Length > 0 ? x + "^" : x) + y.ToString());
string s=list.Aggregate(string.Empty,(x,y)=>(x.Length>0?x+“^”:x)+y.ToString();

回答得很好,因为Join在引擎盖下使用了StringBuilder。回答得不错,但我实际上是在寻找函数式语法!它有什么不起作用的?如果你真的想使用聚合,你可以使用聚合,但它会更难看,性能更差。我特别寻找使用聚合的linq实现,你最初的答案功能性较差,那就是我发表评论的时候。同样,我不认为它是非功能性的。它没有任何变化,它只是将int列表投影到字符串列表中,将其投影到数组中,然后使用标准的库方法,这同样没有副作用。IMO认为,解决方案更容易理解,它强调了在目标平台上做事情的最简单/最好的方法是多么值得,而不是依赖于其他平台的习惯用法。事实并非如此,当使用少量变量时,StringBuilder的效率只会提高一小部分。如果它有几千条,是的。对不起,这是真的,但它仍然不是一个相关的答案,因为我基本上是将1、2、3、4和5连接在一起,而不是大量的文本。这不完全是真的。被连接的字符串的大小也很重要,不仅仅是循环触发的次数。@Kevin:没错。每次连接都会创建一个新字符串,要求复制整个旧字符串。相比之下,StringBuilder仅在必须扩展其内部缓冲区时才需要重新复制,可以通过使用容量初始化来限制内部缓冲区,并且在扩展时通过将大小加倍来自我限制(我相信)。调用ToString时,它可能需要再复制一次,这取决于@Ed:对于足够小的数量,很难找到一种方法来造成可测量的性能影响。话虽如此,当简单高效的Join选项可用时,我并不喜欢故意编写低效的代码。虽然它在某种意义上可能很优雅,但性能会很差。我赞同Jon的回答。这是一个很公平的观点,但是我最多只连接了几个低于1000的整数,这种微优化是不需要的!另外,我对语法很感兴趣,我习惯于用Haskell来表示函数性的东西,所以Linq有时会让我感到困惑+1让它一切正常工作-但我仍然不认为它像使用内置连接方法那样简单/易读:)如果你想缩短最后的
ToString()
调用,你可以不调用它,尽管显然它仍然会被调用。是的,String.Join或StringBuilder执行得更好,聚合执行与问题中的伪代码相同的操作。关于ToString,它确实保存了一个框来显式调用它,而不是让String.Concat方法调用它。@Steven:String的+运算符编译为String.Concat调用。如果所有运算符都是字符串,则调用String.Concat(params String,String),否则调用String.Concat(object,object)。
string s = list.Aggregate<int, string>(String.Empty, (x, y) => (x.Length > 0 ? x + "^" : x) + y.ToString());