【问题标题】:Using LINQ lambda to replace characters from array in string使用 LINQ lambda 替换字符串中数组中的字符
【发布时间】:2016-09-21 08:35:06
【问题描述】:

我的字符串数组包含不允许的字符:

public static string[] IllegalCharacters = { "\"", "/", "\\", "[", "]", ":", "|", "<", ">", "+", "=", ";", ",", "?", "*", "\'", "@", ".", ":", "^", "¨", "å", "ä", "ö", "Å", "Ä", "Ö" };

我可以用这样的 foreach 一个接一个地删除字符:

private string RemoveIllegalCharactersFromString(string text)
{
    foreach (string illegalCharacter in IllegalCharacters.IllegalCharacters)
    {
        text = text.Replace(illegalCharacter, "");
    }
    return text;
}

我的问题是我可以改用 linq lambda 表达式来删除该方法吗?

我现在用的是什么:

public static HashSet<char> IllegalCharacters = new HashSet<char>(new char[] { '\"', '/', '\\', '[', ']', ':', '|', '<', '>', '+', '=', ';', ',', '?', '*', '\'', '@', '.', ':', '^', '¨','\'' });

var t = sourceText.Where(c => !IllegalCharacters.Contains(c)).ToArray();
var result = new string(t);
return result;

【问题讨论】:

  • 您应该测试您的方法是否更有效,您可以通过在类似here 的循环中使用StringBuilder.Replace 轻松改进它。
  • 您能否提供任何信息,说明为什么使用 StringBuilder 会“更快”
  • 我没有说“更快”而是“更高效”。它可能会使用更少的内存或阻止垃圾收集器启动。所以StringBuilder.Replacecan be more efficient.Btw,如果你想删除子字符串而不是字符,LINQ 方法将不再适用。

标签: c# arrays linq replace


【解决方案1】:

我建议将IllegalCharacters 改为char 集合(非法字符应该是字符,对吧?),例如

  public static HashSet<char> IllegalCharacters = new HashSet<char>(
    new char[] { '"', '\\', ..., 'Ä', 'Ö' });

所以你可以放一个明显的 Linq:

  string source = "123:+-456";

  string result = String.Concat(source
   .Where(c => !IllegalCharacters.Contains(c)));

【讨论】:

  • 我喜欢HashSet(+1),它提供 O(1) 访问权限。
  • 这取决于“Å Ä Ö”是否被视为字符。我将不得不对此进行测试!谢谢!
  • Concat 有问题,所以我将其替换为: var t = source.Where(c => !IllegalCharacters.Contains(c)).ToArray(); var 结果 = 新字符串(t);返回结果;
【解决方案2】:

这是一种使用 Linq 的方法

string Text = "1:2+3[4]5|6";
string Result = new string(Text.Where(x => !IllegalCharacters.Contains(x.ToString())).ToArray());

我会将字符存储在 char 而不是 string 类型中,并使用 HashSet 而不是 string[]

HashSet<char> IllegalCharacters = new HashSet<char>() { '\'', '/', '\\', '[', ']', ':', '|', '<', '>', '+', '=', ';', ',', '?', '*', '\'', '@', '.', ':', '^', '¨', 'å', 'ä', 'ö', 'Å', 'Ä', 'Ö' };

string Text = "1:2+3[4]5|6";
string Result = new string(Text.Where(x => !IllegalCharacters.Contains(x)).ToArray());

【讨论】:

    【解决方案3】:

    您可以使用Aggregate。像这样:

    private string RemoveIllegalCharactersFromString(string text)
    {
        return IllegalCharacters.Aggregate(text, (current, illegalCharacter) => current.Replace(illegalCharacter, ""));
    }
    

    结果:

    string result = RemoveIllegalCharactersFromString("HelloÄ[2536]:Y?eÖs*");
    //Result => Hello2536Yes
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-12
      • 1970-01-01
      • 1970-01-01
      • 2010-09-28
      • 2012-04-26
      • 2019-03-21
      • 2014-03-21
      • 1970-01-01
      相关资源
      最近更新 更多