c# - 使用多态方法生成排列

标签 c# polymorphism permutation

说明:

Please write a piece of code that takes as an input a list in which each element is another list containing an unknown type and which returns a list of all possible lists that can be obtained by taking one element from each of the input lists.

For example:

[[1, 2], [3, 4]], should return: [[1, 3], [1, 4], [2, 3], [2, 4]].

[['1'], ['2'], ['3', '4' ]], should return [['1', '2', '3'], ['1', '2', '4']].

我的代码:

public static void Main(string[] args)
{
     //Create a list of lists of objects.
       var collections = new List<List<object>>();
       collections.Add(new List<object> { 1, 5, 3 });
       collections.Add(new List<object> { 7, 9 });
       collections.Add(new List<object> { "a", "b" });

     //Get all the possible permutations
       var combinations = GetPermutations(collections);

     //Loop through the results and display them in console
       foreach (var result in combinations)
       {
           result.ForEach(item => Console.Write(item + " "));
           Console.WriteLine();
       }

        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
}

private static List<List<object>> GetPermutations(List<List<object>> collections)
{
        List<List<object>> permutations = new List<List<object>>();

       //Check if the input list has any data, else return the empty list.
        if (collections.Count <= 0)
            return permutations;

       //Add the values of the first set to the empty List<List<object>>
       //permutations list
        foreach (var value in collections[0])
            permutations.Add(new List<object> { value });


       /* Skip the first set of List<List<object>> collections as it was
        * already added to the permutations list, and loop through the
        * remaining sets. For each set, call the AppendValues function
        * to append each value in the set to the permuations list.
        * */
        foreach (var set in collections.Skip(1))
             permutations = AppendNewValues(permutations, set);

        return permutations;
}

private static List<List<object>> AppendNewValues(List<List<object>> permutations, List<object> set)
{
        //Loop through the values in the set and append them to each of the
        //list of permutations calculated so far.
        var newCombinations = from additional in set
                              from value in permutations
                              select new List<object>(value) { additional };

        return newCombinations.ToList();
}

我怎样才能让它与返回通用列表的多态方法一起工作?

最佳答案

Please write a piece of code that takes as an input a list in which each element is another list containing an unknown type and which returns a list of all possible lists that can be obtained by taking one element from each of the input lists.

我会要求澄清,比如“你是说通用方法吗?”

说到多态性,他们很可能只能编写一个方法并从任意类型调用它,例如:

public static IList<IList<T>> GetPermutations<T>(IList<IList<T>> inputLists) {
    if (inputLists.Count < 2) {
        // special case. 
    }

    return _permutationHelper(0, inputLists);
}

private static IList<IList<T>> _permutationHelper<T>(int i, IList<IList<T>> inputLists) {
    IList<IList<T>> returnValue = new List<IList<T>>();
    if (i == inputLists.Count) {
        returnValue.Add(new List<T>());
    } else {
        foreach (var t in inputLists[i]) {
            foreach (var list in _permutationHelper(i + 1, inputLists)) {
                list.Add(t);
                returnValue.Add(list);
            }
        }
    }

    return returnValue;
}

您的实现确实会在运行时允许任意类型,但它会失去类型安全性。鉴于它是 C# 中的实现,类型安全是一项要求是一个安全的猜测——但问这两个问题也没什么坏处。

另一件值得注意的事情 - 他们可能只是说他们正在寻找 Cartesian product给定的列表。

关于c# - 使用多态方法生成排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30066258/

相关文章:

c# - 为什么我们在 c# 中将 using 放在 streamreader 之前

c# - 带有代码数据的脚本表

异构列表元素的 Python 排列

fortran - 覆盖不同模块中的私有(private)函数

C++11 和多态 lambda 的缺失——为什么?

python - (几乎)从列表中均匀选择项目

python - python 中的排列但只允许每个元素最多使用 n 次

c# - 使用 VS2010 和 Excel 2010 访问 FormatCondition 的异常

c# - 如何记录扩展到多个实例的 webjob 的实例 ID

c++ - 遍历类型列表