使用LINQ从C#中的字符串中获取首字母缩写词?

时间:2010-10-22 19:32:23

标签: c# linq string

以下是我将如何编写一个函数来创建Java风格的首字母缩写词:

    string makeAcronym(string str)
    {
        string result = "";
        for (int i = 0; i < str.Length; i++)
        {
            if (i == 0 && str[i].ToString() != " ")
            {
                result += str[i];
                continue;
            }

            if (str[i - 1].ToString() == " " && str[i].ToString() != " ")
            {
                result += str[i];
            }
        }

        return result;
    }

有没有更优雅的方法可以使用LINQ或使用一些内置的C#函数?

6 个答案:

答案 0 :(得分:13)

以下是几个选项

使用string.Join的唯一.NET 4选项:

 string acronym = string.Join(string.Empty,
      input.Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries).Select(s => s[0])
      );

在.NET 3.5(或4.0)中,您可以执行以下操作:

 string acronym = new string(input.Split(new[] {' '}, 
      stringSplitOptions.RemoveEmptyEntries).Select(s => s[0]).ToArray());

另一种选择(我个人选择),基于您原来的逻辑:

 string acronym = new string(
      input.Where( (c,i) => c != ' ' && (i == 0 || input[i-1] == ' ') )
      .ToArray()
    );

答案 1 :(得分:8)

这是迄今为止我还没有看到的一种技术。这取决于假设所有字母应该在首字母缩略词中(并且只有那些字母)在字符串中是大写的。

string MakeAcronym(string input)
{
    var chars = input.Where(Char.IsUpper).ToArray();
    return new String(chars);
}

// MakeAcronym("Transmission Control Protocol") == "TCP"

答案 2 :(得分:5)

使用Regex / Linq组合可以很好地完成这项工作:

String
    .Join("",
        Regex
            .Matches("this is a test",@"(?<=^| )\w")
            .Cast<Match>()
            .Select(m=>m.Value)
            .ToArray()
    )

答案 3 :(得分:4)

您可以使用LINQ Aggregate方法以相当优雅的方式执行此操作。

这样的事情:

private static string MakeAcronym2(string str)
{
    return str.Split(' ').Aggregate("", (x, y) => x += y[0]);
}

答案 4 :(得分:2)

LINQ可以为此工作,但通常我发现使用string实例构建StringBuilder值更好。这样可以避免不必要的string分配。

string makeAcronym(string str) { 
  var builder = new StringBuilder();
  for ( var i = 0; i < str.Length; i++ ) { 
    var c = str[i];
    if ( c == ' ' ) {
      continue;
    }
    if ( i == 0 || str[i-1] == ' ' ) {
      builder.Append(c);
    }
  }
  return builder.ToString();
}

答案 5 :(得分:0)

string makeAcronym(string str)
{
    return new string(str.Split(new [] {' '}, 
        StringSplitOptions.RemoveEmptyEntries).Select(s => s[0]).ToArray());
}