我有一个小算法,它取代了字符串中字符的位置:
class Program
{
static void Main(string[] args)
{
String pairSwitchedStr = pairSwitch("some short sentence");
Console.WriteLine(pairSwitchedStr);
Console.ReadKey();
}
private static String pairSwitch(String str)
{
StringBuilder pairSwitchedStringBuilder = new StringBuilder();
for (int position = 0; position + 1 < str.Length; position += 2)
{
pairSwitchedStringBuilder.Append((char)str[position + 1]);
pairSwitchedStringBuilder.Append((char)str[position]);
}
return pairSwitchedStringBuilder.ToString();
}
}
Run Code Online (Sandbox Code Playgroud)
我想尽可能使用泛型,可能使用泛型.我想拥有的东西是:
我怀疑解决方案必须使用泛型,因为算法正在处理T的实例列表(有T是......某事).C#版本不感兴趣,我想如果使用C#version> 2.0的功能,解决方案会更好.
我最终得到:(我修复了上面代码中的错误,它没有正确处理奇数长度)
private static IEnumerable<T> switchSubstitutionCipher<T>(IEnumerable<T> input)
{
bool even = false;
T lastItem = default(T);
foreach (T element in input)
{
if (even) {
yield return element;
yield return lastItem;
}
even = !even;
lastItem = element;
}
if (even)
yield return lastItem;
}
Run Code Online (Sandbox Code Playgroud)
C#中的字符串在概念上与数组或链表非常不同.尽管字符串确实实现了IEnumerable<Char>,但它是一个不可变类,所以你不能像IList<T>或者一样使用它Array.
我建议保留你的字符串实现,然后为任何添加一个通用实现IList<T>:
private static IList<T> pairSwitch<T>(IList<T> original)
{
List<T> results = new List<T>(original.Count);
for (int i=0;i<original.Count-1;i+=2) // Using -1 to make sure an odd number doesn't throw...
{
results.Add(original[i+1]);
results.Add(original[i]);
}
return results;
}
Run Code Online (Sandbox Code Playgroud)
private static IEnumerable<T> pairSwitch<T>(IEnumerable<T> input)
{
T current = default(T); // just to satisfy compiler
bool odd = true;
foreach (T element in input)
{
if (odd) current = element;
else
{
yield return element;
yield return current;
}
odd = !odd;
}
}
static void Main(string[] args)
{
string test = "Hello";
string result = new string(pairSwitch(test).ToArray());
Run Code Online (Sandbox Code Playgroud)
优点:
懒惰的评估 - 这可能对大型列表很重要
使用IEnumerable实现处理字符串实现.