IEnumerable扩展方法不会出现在列表中

时间:2015-02-13 04:51:11

标签: c# extension-methods ienumerable

我正在尝试为IEnumerables创建一个通用的扩展方法,我可以随机化它们内部的内容。我正在编写我的测试,并发现虽然它适用于Arrays,但Lists没有可用的扩展方法。我很好奇是否对我的List接口的实现结束有误解,或者我错过了什么。我将非常感谢您的解释或不正确的行为。

    /// <summary>
    /// Randomizes the order of an array.
    /// </summary>
    /// <typeparam name="T">The type of object this holds.</typeparam>
    /// <param name="list">The enumerable that is being modified.</param>
    /// <returns>The randomized enumerable.</returns>
    public static IEnumerable<T> GetRandomList<T>(this IEnumerable<T> list)
    {
        return GenerateRandomEnumerable<T>(list);
    }

    /// <summary>
    /// Randomizes the order of an array.
    /// </summary>
    /// <typeparam name="T">The type of array this is.</typeparam>
    /// <param name="list">The array that is being modified.</param>
    public static void RandomizeOrder<T>(this IEnumerable<T> list)
    {
        IEnumerable<T> newList = GenerateRandomEnumerable<T>(list);

        // Reassign the values
        for (int i = 0; i < list.Count(); i++)
        {
            T item = list.ElementAt(i);
            item = newList.ElementAt(i);
        }
    }

    /// <summary>
    /// Randomizes the order of an enumerable.
    /// </summary>
    /// <typeparam name="T">The type of object this holds.</typeparam>
    /// <param name="list">The enumerable that is being modified.</param>
    /// <returns>A randomized enumerable.</returns>
    private static IEnumerable<T> GenerateRandomEnumerable<T>(IEnumerable<T> list)
    {
        // Create the list and randomizer that will be needed
        List<KeyValuePair<int, T>> returnList = new List<KeyValuePair<int, T>>();
        Random randomizer = new Random();

        // Move the enumerable into a new list with random numbers
        foreach (T curT in list)
        {
            returnList.Add(new KeyValuePair<int, T>(randomizer.Next(), curT));
        }

        // Sort by the random value
        returnList.Sort((a, b) => a.Key.CompareTo(b.Key));

        // Return the randomized enumerable
        return returnList.Select(x => x.Value);
    }

修改

我希望能够传达这个问题,但我会尝试澄清更多。

如果我写这个:

int[] testArray = new int[3]{1,2,3};
testArray.RandomizeOrder<int>();

完美无缺。

但是,当我尝试写这个:

List<int> originalList = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
originalList.RandomizeOrder<int>();

它说List不包含成员RandomizeOrder和最好的扩展方法重载RandomizeOrder(这个int [])有一些无效的参数。所以这些线路目前正在给我带来麻烦。这与功能代码属于同一类,因此名称空间全部存在,只有这里的列表导致我出现问题。

我可能会忽略一些非常简单和愚蠢的事情,但是协助会很有帮助。提前谢谢。

P.S。 我也不确定这是否重要,这个项目也在.NET 2.0中,如果这会影响到这一点。对不起我以前没提过。

0 个答案:

没有答案