有没有更好的方法在C#中从大写字母创建首字母缩略词?

5

如何在C#中从大写字母创建缩写的最佳方法是什么?

示例:

Alfa_BetaGameDelta_Epsilon

期望结果:

ABGDE

我的解决方案可以工作,但不美观。

        var classNameAbbreviationRegex = new Regex("[A-Z]+", RegexOptions.Compiled);
        var matches = classNameAbbreviationRegex.Matches(enumTypeName);
        var letters = new string[matches.Count];

        for (var i = 0; i < matches.Count; i++)
        {
            letters[i] = matches[i].Value;
        }

        var abbreviation = string.Join(string.Empty, letters);

你只能接受一个答案。我看到你先接受了Tyler的答案,现在又接受了我的答案。如果你喜欢多个答案,请接受你最终使用的答案。 - Daniel Hilgarth
6个回答

5
string.Join("", s.Where(x => char.IsUpper(x))

5
string.Join("", s.Where(char.IsUpper));

1
@BartoszKP 我认为string.Empty和""之间的选择是个人偏好问题。 - Tyler
1
@BartoszKP:string.Empty并不比""更受欢迎,这只是一种编码指南。两者之间没有任何区别。 - Steven
1
我更喜欢使用 "",因为这样打起来更容易。 - Sayse
2
但我认为在这种情况下使用ConcatJoin更直观。 - Steven
1
@BartoszKP:有几个指南。一些强制使用string.Empty,另一些则强制使用""。没有更好的选择,只要在代码库中保持一致即可。 - Steven
显示剩余9条评论

5
string test = "Alfa_BetaGameDelta_Epsilon";
string result = string.Concat(test.Where(char.IsUpper));

FYI http://www.alexjamesbrown.com/blog/development/c-string-concat-vs-string-join/ - Squirrel5853
@SecretSquirrel:我认为这并不适用,因为博客文章实际上使用的是一个分隔符,而这个问题并非如此。 - Daniel Hilgarth
@DanielHilgarth 是的,抱歉你是对的,我刚刚做了同样的测试,使用没有分隔符的IEnmerable<string>时Concat更快 :) - Squirrel5853

3
您可以使用Where方法来过滤掉大写字母,而Char.IsUpper方法可以直接用作委托而无需使用lambda表达式。您可以从字符数组创建结果字符串:
string abbreviation = new String(enumTypeName.Where(Char.IsUpper).ToArray());

3
通过使用更多的正则表达式 :)
var ac = string.Join(string.Empty, 
                     Regex.Match("Alfa_BetaGameDelta_Epsilon", 
                                 "(?:([A-Z]+)(?:[^A-Z]*))*")
                          .Groups[1]
                          .Captures
                          .Cast<Capture>()
                          .Select(p => p.Value));

更多的正则表达式总是解决方案,特别是在使用LINQ时!:-)
该正则表达式将所有 [A-Z] 放入捕获组1中(因为所有其他 () 都是非捕获组 (?:)),并通过将它们放入非捕获组中 "跳过" 所有非 [A-Z][^A-Z])。最后一个 *将这样做0-无限次。然后用一点LINQ来选择每个捕获值 .Select(p => p.Value)string.Join 来连接它们。
请注意,这不符合Unicode规范... ÀÈÌÒÙ将被忽略。更好的正则表达式应使用 @"(?:(\p{Lu}+)(?:[^\p{Lu}]*))*",其中 \p{Lu} 是Unicode类UppercaseLetter。
(是的,这是无用的... 使用 LINQ + IsUpper 的其他方法更好 :-) 但整个示例都是为了展示正则表达式在Unicode中存在的问题)
简单得多:
var ac = Regex.Replace("Alfa_BetaGameDelta_Epsilon", @"[^\p{Lu}]", string.Empty);

简单地删除所有非大写字母 :-)


2
var str = "Alfa_BetaGammaDelta_Epsilon";
var abbreviation = string.Join(string.Empty, str.Where(c => c.IsUpper()));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接