我用来随机排序List.我可以用Enumerable做同样的事情吗?

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位置获得元素......

我很好奇......

Mar*_*ell 6

对于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)