mar*_*zzz 2 c# random ienumerable list
这是我在List中随机排序第一个N元素的代码:
int upper = 1;
if (myList.Count > 1)
{
Random r = new Random();
upper = Math.Min(maxNumberOfPackets, myList.Count);
for (int i = 0; i < upper; i++)
{
int randInd = r.Next(i, myList.Count);
var temp = myList[i];
myList[i] = myList[randInd];
myList[randInd] = temp;
}
}
Run Code Online (Sandbox Code Playgroud)
好吧,现在我有"必要性"只使用Enumerable(出于某种原因;所以我不想在Enumerable中转换它).
根据您的了解,我可以使用Enumerable进行相同的操作吗?我认为痛苦是在X位置获得元素......
我很好奇......
对于IEnumerable[<T>]来源,您通常应该只假设它们可以被读取一次,当然,在您消费它之前,您无法可靠地知道它的长度.随机化它通常需要缓冲.你也可以这样做:
var list = source.ToList();
Run Code Online (Sandbox Code Playgroud)
并使用您现有的列表随机代码.当然,IEnumerable[<T>]如果要保持输入和输出类似,则可以再次返回该列表.
如果你真的想,你可以开始争抢:
static IEnumerable<T> ScrambleStart(this IEnumerable<T> source,
int numberToScramble)
{
using(var iter = source.GetEnumerator()) {
List<T> list = new List<T>();
while(iter.MoveNext()) {
list.Add(iter.Current);
if(list.Count == numberToScramble) break;
}
ScrambleList(list); // your existing code
foreach(var item in list) yield return item;
while(iter.MoveNext()) {
yield return iter.Current;
}
}
}
Run Code Online (Sandbox Code Playgroud)