缩写列表中给出的字符串

时间:2019-02-13 10:30:05

标签: c# string linq

我有一个名称列表,我想将其缩写,但是我想知道是否存在内置函数。

例如:

John Doe -> JD
Jane -> J

我正在尝试以下方法:

myListOfNames.ForEach(x => x = abbreviate(x));

我知道我可以创建自己的函数来进行缩写,但是有没有更好的方法使用内置函数呢?

4 个答案:

答案 0 :(得分:1)

如果只考虑大写字母,则可以仅使用Linq

进行存档。
string.Join("", "John McDonald"
    .Split(' ')
    .Select(w => w.First())
    .Where(c => char.IsUpper(c)));
//John McDonald = JM; Baron van Munchausen = BM

答案 1 :(得分:1)

您可以执行以下操作:

var result = name.Split(' ')
                        .Select(s => s.First())
                        .ToArray());

答案 2 :(得分:1)

使用空格将您的姓名分隔开,然后选择每个分隔字符串的首字母。

尝试使用linq,

List<string> myListOfNames = new List<string>();
myListOfNames.Add("John Doe");
myListOfNames.Add("John S Doe");

var abbrs = myListOfNames.Select(x => string.Join("", x.Split(' ').Select(y => y.FirstOrDefault()))).ToList();

注意:假设您的名字用空格分隔。

输出:(来自调试器)

enter image description here

答案 3 :(得分:1)

首先,我们应详细制定规则,例如:

  1. 从每个单词中最多取1 大写字母(单词是空格之间的字符
  2. 如果单词没有大写字母,请跳过(例如标题von
  3. 如果单词有几个大写字母,请在D中使用最后一个一个:McDonald

实施:

  Func<string, string> abbreviation = (name) => string.Concat(name
    .Split(' ')                     // split to words
    .Select(word => word             
      .Where(c => char.IsUpper(c))  // only capital letters matter
      .LastOrDefault())             // take the last 
    .Where(c => c > 0));            // if word doesn't have capital letter, drop it

  ...

  string result = abbreviation("John McDonald");

演示:

  string[] Tests = new string[] {
    "John McDonald",
    "Baron von Munchausen",
    "Charles de Batz de Castelmore d'Artagnan"
  };

  string report = string.Join(Environment.NewLine, Tests
    .Select(test => $"{test,-50} -> {abbreviation(test)}"));

  Console.Write(report);

结果:

John McDonald                                      -> JD
Baron von Munchausen                               -> BM
Charles de Batz de Castelmore d'Artagnan           -> CBCA