【问题标题】:Join a string[] Without Using string.Join在不使用 string.Join 的情况下加入字符串 []
【发布时间】:2012-10-03 18:08:39
【问题描述】:

此问题仅用于学术目的。

假设我有以下代码...

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 语句来做这件事……希望你们都已经知道了!

【问题讨论】:

  • 有趣的答案,但我很好奇,您为什么要寻找与 string.Join 不同的方法?而且,您说您正在寻找 Linq 语句,但是您接受的答案(确实是一个很好的答案)根本没有使用 Linq :)
  • @Wasp,这个问题又是学术性的。此外,我的意思是不是说我需要通过 LINQ 解决它,而是因为我一直在寻找一个 LINQ 语句来解决它,因为我认为 那是最好的方法。不过,最后,Guffa 给我展示了一个更完美的方法。
  • 所以问题 应该 是 - 我怎样才能忽略这个字符串的最后一段并去掉逗号。你很幸运,得到了你需要的答案,但没有得到你要求的答案。
  • @DStanley,没错。我的道歉朋友。仍然是一个很好的答案,为什么我 +1 了。

标签: c# .net string linq


【解决方案1】:

使用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 更好。

【讨论】:

    【解决方案2】:

    也不要使用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));
    

    【讨论】:

    • 非常好的答案和总体上最好的方法。我将使用我的整体解决方案编辑您的答案,因为出现了一个新要求,我希望人们看到它(name 字段中可以有逗号,即使他们通过 CSV 发送文件,也许应该使用更好的分隔符吧?)
    • @Mike:是的,你在没有逗号的情况下加入了字符串。您可以使用 Replace 将它们从第一个字符串中删除。
    • 我错了!我不必修改它,因为只有两个值,并且您每次都将子字符串运行到​​ LAST 位置。非常、非常、非常好的解决方案,而且非常高效!
    【解决方案3】:

    怎么样

    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;
    

    【讨论】:

    • +1 ... @YoryeNathan,这是一个完全可以接受的解决方案。二次运行时,是的,但对于可能的用例,这可能仍然比使用 StringBuilder 的解决方案更快:查看 OP 的代码,它用于设置名为 name 的 XML 属性值——你预计这个系列会持续多久?
    • @YoryeNathan 不,“非常慢”是将每个结果通过 FTP 传输到文件服务器,然后远程连接文件。这比使用StringBuilder稍微慢一点,这是理所当然的,但在我的(有偏见的)观点中,太慢有点牵强。
    • @KonradRudolph:你说得非常正确。我为这个答案 +1 了,因为它非常正确和简洁。
    【解决方案4】:
    var strs = new string[100];
    ...
    
    var result = strs.Aggregate(new StringBuilder(strs.Sum(x => x.Length)),
                                (sb, curr) => sb.Append(s + ", ")).ToString();
    

    现在只需要从末尾删除最后一个“,”即可。

    【讨论】:

    • StringBuilder 一个大小会产生加速,但不是渐近加速。这可能小于Sum 的开销。
    【解决方案5】:
    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));
    

    【讨论】:

      猜你喜欢
      • 2011-06-22
      • 2014-11-23
      • 2017-04-01
      • 2018-03-24
      • 2023-03-21
      • 2015-07-25
      • 1970-01-01
      • 1970-01-01
      • 2014-04-23
      相关资源
      最近更新 更多