是否可以在一行中写入ROT13?

我有以下代码,我希望看到它作为oneliner。 但是,由于我对C#很新,我目前还不知道如何做到这一点……

码:

static string ROT13 (string input) { if (string.IsNullOrEmpty(input)) return input; char[] buffer = new char[input.Length]; for (int i = 0; i = 97 && c  122) j -= 26; buffer[i] = (char)j; } else if (c >= 65 && c  90) j -= 26; buffer[i] = (char)j; } else { buffer[i] = (char)c; } } return new string(buffer); } 

对于给您带来的任何不便,我很抱歉,只是想了解更多有关这种漂亮语言的信息:)

那这个呢? 我碰巧有这个代码,它不漂亮,但它完成了这项工作。 只是为了确保:一个内衬很有趣,但它们通常不会提高可读性和代码可维护性……所以我坚持你自己的解决方案:)

 static string ROT13(string input) { return !string.IsNullOrEmpty(input) ? new string (input.ToCharArray().Select(s => { return (char)(( s >= 97 && s <= 122 ) ? ( (s + 13 > 122 ) ? s - 13 : s + 13) : ( s >= 65 && s <= 90 ? (s + 13 > 90 ? s - 13 : s + 13) : s )); }).ToArray() ) : input; } 

如果您需要更多说明,请询问。

不是真正的单行,但仍比原始代码短,比其他答案更容易理解:

 static string Rot13(string input) { if(input == null) return null; Tuple[] ranges = { Tuple.Create(65, 90), Tuple.Create(97, 122) }; var chars = input.Select(x => { var range = ranges.SingleOrDefault(y => x >= y.Item1 && x <= y.Item2); if(range == null) return x; return (char)((x - range.Item1 + 13) % 26) + range.Item1; }); return string.Concat(chars); } 

另一个更好地表达ROT13中发生的事情的版本是:

 static string Rot13(string input) { var lowerCase = Enumerable.Range('a', 26).Select(x => (char)x).ToArray(); var upperCase = Enumerable.Range('A', 26).Select(x => (char)x).ToArray(); var mapItems = new[] { lowerCase.Zip(lowerCase.Skip(13).Concat(lowerCase.Take(13)), (k, v) => Tuple.Create(k, v)), upperCase.Zip(upperCase.Skip(13).Concat(upperCase.Take(13)), (k, v) => Tuple.Create(k, v)) }; var map = mapItems.SelectMany(x => x).ToDictionary(x => x.Item1, x => x.Item2); return new string(input.Select(x => Map(map, x)).ToArray()); } static char Map(Dictionary map, char c) { char result; if(!map.TryGetValue(c, out result)) return c; return result; } 

只是在比较中使用其他字符的替代版本,使事情更“清晰”

 static string ROT13(string input) { return !string.IsNullOrEmpty(input) ? new string(input.Select(x => (x >= 'a' && x <= 'z') ? (char)((x - 'a' + 13) % 26 + 'a') : ((x >= 'A' && x <= 'Z') ? (char)((x - 'A' + 13) % 26 + 'A') : x)).ToArray()) : input; }