C# 在不使用字符串的情况下联接字符串[]。联接

C# 在不使用字符串的情况下联接字符串[]。联接,c#,.net,string,linq,C#,.net,String,Linq,这个问题仅用于学术目的 让我们假设我有以下代码 var split = line.Split(new[] { ',' }, System.StringSplitOptions.RemoveEmptyEntries); var elem = new XElement("shop"); elem.SetAttributeValue("name", split.Take(split.Length - 1)); <===== elem.SetAttributeValue("tin", split

这个问题仅用于学术目的

让我们假设我有以下代码

var split = line.Split(new[] { ',' }, System.StringSplitOptions.RemoveEmptyEntries);
var elem = new XElement("shop");
elem.SetAttributeValue("name", split.Take(split.Length - 1));  <=====
elem.SetAttributeValue("tin", split.Last());
。。。不使用
string.Join

可能吗?我似乎找不到LINQ语句来做这件事。。。希望你们都已经知道了

怎么样

split.Take(split.Length - 1).Aggregate((s1,s2)=> s1 + s2);
或非linq等效物:

string s = "";
for(int i = 0; i < split.Length - 1; i++)
{
   s += split[i];
}
return s;
string s=”“;
对于(int i=0;i
使用
StringBuilder
实现O(n)性能:

split
    .Take(split.Length - 1)
    .Aggregate(new StringBuilder(), (sb, s) => sb.Append(s)).ToString();
如果目标是避免组合LINQ调用和静态方法树的尴尬,那么简单的解决方案是扩展方法:

public static string Join(this IEnumerable<string> self, string separator = "")
{
    return string.Join(separator, self);
}
我发现这比在复杂表达式中使用
string.Join
要好得多

var strs = new string[100];
...

var result = strs.Aggregate(new StringBuilder(strs.Sum(x => x.Length)),
                            (sb, curr) => sb.Append(s + ", ")).ToString();

现在只需删除结尾处的最后一个“,”。

也不要使用
拆分
,只需找到最后一个逗号,然后使用
子字符串来拆分字符串:

int pos = line.LastIndexOf(',');
var elem = new XElement("shop");
elem.SetAttributeValue("name", line.Substring(0, pos).Replace(",", String.Empty));
elem.SetAttributeValue("tin", line.Substring(pos + 1));
string myString=“Hello World”
var myList=新列表();
对于(int i=0;i<10;i++)
添加(i);
var newList=myList.Aggregate(string.Empty,(current,num)=>current+myString.Substring(num,1));

+1…@YoryeNathan,这是一个完全可以接受的解决方案。二次运行时,正确,但对于可能的用例,这可能仍然比使用
StringBuilder
的解决方案快:查看OP的代码,这用于设置名为
name
的XML属性值-您预计集合会持续多长时间?@YoryeNathan否,“非常慢”将每个结果FTP到文件服务器,然后远程连接文件。当然,这比使用
StringBuilder
稍微慢一点,但在我(有偏见的)看来,非常慢有点夸张。@KonradRudolph:你说得很对。我选择这个答案是因为它非常正确和简洁。给
StringBuilder
一个大小会产生一个加速,但不是一个渐进加速。这可能比
总和的开销要小。这是一个非常好的答案,也是总体上最好的方法。我将用我的整体解决方案编辑您的答案,因为出现了一个新的要求,我希望人们看到它(即使他们通过CSV发送文件,
name
字段中也可以有逗号,也许应该使用更好的分隔符,嗯?)@Mike:对,您加入的字符串没有逗号。你可以用
Replace
从第一个字符串中删除它们。我错了!我不必修改它,因为只有两个值,并且每次都将子字符串运行到最后一个位置。非常非常好的解决方案,而且非常高效!有趣的答案,但我很好奇,为什么你要寻找一种不同于string.Join的方法?而且,你说你正在寻找一个Linq声明,但是你被接受的答案(确实是一个好答案)根本没有使用Linq:)@Wasp,同样,这个问题是学术性的。此外,我的意思不是说我要求通过LINQ解决问题,而是说我一直在寻找LINQ声明来解决问题,因为我认为这是最好的方法。然而,最后,Guffa向我展示了一个更完美的方法。所以问题应该是——我怎么能忽略这个字符串的最后一段并去掉逗号呢。你很幸运,得到了你需要的答案,但不是你要求的答案。@DStanley,你说得对。我向你的朋友道歉。这仍然是一个很好的答案,为什么我会选择它。
var strs = new string[100];
...

var result = strs.Aggregate(new StringBuilder(strs.Sum(x => x.Length)),
                            (sb, curr) => sb.Append(s + ", ")).ToString();
int pos = line.LastIndexOf(',');
var elem = new XElement("shop");
elem.SetAttributeValue("name", line.Substring(0, pos).Replace(",", String.Empty));
elem.SetAttributeValue("tin", line.Substring(pos + 1));
string myString = "Hello World"
var myList= new List<int>();

for (int i = 0; i < 10; i++)
    myList.Add(i);

var newList = myList.Aggregate(string.Empty, (current, num) => current + myString.Substring(num, 1));