当前位置:  开发笔记 > 编程语言 > 正文

你可以在C#中乱序列举一个集合吗?

如何解决《你可以在C#中乱序列举一个集合吗?》经验,为你挑选了2个好方法。

有没有办法使用foreach循环向后或以完全随机的顺序迭代集合?



1> cfeduke..:

System.Linq你可以做...

// List<...> list;
foreach (var i in list.Reverse())
{
}

对于随机顺序,您必须使用list.OrderBy(另一个Linq扩展)随机排序,然后迭代该有序列表.

var rnd = new Random();
var randomlyOrdered = list.OrderBy(i => rnd.Next());
foreach (var i in randomlyOrdered)
{
}


i => rnd.Next()有点危险 - 它假定每个项目只调用一次委托(即,一个实现细节).如果没有,Sort可能会爆炸.碰巧的是,我认为你可以逃脱它 - 但是明确的选择第一个(对于临时对象)可能是值得建议的......
另外,执行OrderBy(g => Guid.NewGuid())的速度更快(更随机)

2> Jacob Carpen..:

正如其他答案所提到的,Reverse()扩展方法将允许您以相反的顺序枚举序列.

这是一个随机枚举扩展方法:

public static IEnumerable OrderRandomly(this IEnumerable sequence)
{
    Random random = new Random();
    List copy = sequence.ToList();

    while (copy.Count > 0)
    {
        int index = random.Next(copy.Count);
        yield return copy[index];
        copy.RemoveAt(index);
    }
}

您的用法是:

foreach (int n in Enumerable.Range(1, 10).OrderRandomly())
    Console.WriteLine(n);


像这样使用`List`和`RemoveAt`具有O(n ^ 2)复杂度.对于类似但O(n)算法,请参阅此问题:http://stackoverflow.com/questions/4412405/is-there-a-performance-difference-between-these-two-algorithms-for-shuffling-an -一世
推荐阅读
农大军乐团_697
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有