Получить аббревиатуру из строки в C #, используя LINQ? - PullRequest
7 голосов
/ 22 октября 2010

Вот как я бы написал функцию для создания аббревиатуры в стиле 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 ]

13 голосов
/ 22 октября 2010

Вот несколько вариантов

Опция .NET 4 only с использованием string.Join:

 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()
    );
8 голосов
/ 23 октября 2010

Вот техника, которую я до сих пор не видел. Это зависит от предположения, что все буквы, которые должны быть в акрониме (и только эти буквы), находятся в верхнем регистре в строке.

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

// MakeAcronym("Transmission Control Protocol") == "TCP"
5 голосов
/ 22 октября 2010

Вы можете сделать это довольно хорошо, используя комбо Regex / Linq:

String
    .Join("",
        Regex
            .Matches("this is a test",@"(?<=^| )\w")
            .Cast<Match>()
            .Select(m=>m.Value)
            .ToArray()
    )
4 голосов
/ 22 октября 2010

Вы можете использовать метод Агрегирования LINQ, чтобы сделать это довольно элегантно.

Примерно так:

private static string MakeAcronym2(string str)
{
    return str.Split(' ').Aggregate("", (x, y) => x += y[0]);
}
2 голосов
/ 22 октября 2010

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();
}
0 голосов
/ 22 октября 2010
string makeAcronym(string str)
{
    return new string(str.Split(new [] {' '}, 
        StringSplitOptions.RemoveEmptyEntries).Select(s => s[0]).ToArray());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...