使用泛型使算法在"某事"列表上工作而不是仅使用String

Del*_*ted 4 c# generics

我有一个小算法,它取代了字符串中字符的位置:

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)

Ree*_*sey 9

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)


Ian*_*cer 5

    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)

优点:

  1. 懒惰的评估 - 这可能对大型列表很重要

  2. 使用IEnumerable实现处理字符串实现.