我正在尝试为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中,如果这会影响到这一点。对不起我以前没提过。