此问题仅供学术用途。
我们假设我有以下代码......
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(string.Empty, split.Take(split.Length - 1));
...不使用string.Join
。
这可能吗?我似乎无法找到LINQ语句来做...希望你们都已经知道了!
答案 0 :(得分:6)
使用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);
}
然后:
split.Take(split.Length - 1).Join();
我觉得这比在复杂的表达式中使用string.Join
要好得多。
答案 1 :(得分:4)
也不要使用Split
,只需找到最后一个逗号并使用Substring
来划分字符串:
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));
答案 2 :(得分:2)
怎么样
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;
答案 3 :(得分:0)
var strs = new string[100];
...
var result = strs.Aggregate(new StringBuilder(strs.Sum(x => x.Length)),
(sb, curr) => sb.Append(s + ", ")).ToString();
只需要从最后删除最后一个“,”。
答案 4 :(得分:0)
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));