使用LINQ填充List<int>

7
在Python中,您可以做以下操作:
arr = list(set(randint(-50, 50) for _ in range(10)))

我知道如何编写一个扩展方法,用于填充数组、列表或其他需要随机值的数据结构。 但是我觉得这样做很麻烦,我真的很佩服你在Python中如何做到这一点。 虽然我只知道Enumerable.Range,它只能用于生成固定的序列,据我所知。 那么,在C#中是否也有类似的方法呢?
4个回答

16
你可以这样做:
Random rnd = new Random();
List<int> = Enumerable.Range(0,10).Select(n => rnd.Next(-50, 51)).ToList();

啊,我简直想不出如何在Enumerable.Range中调用select。谢谢! - CasperT
+1 这就是我刚刚想到的解决方案,但你比我更快地完成了。 - Brian Rasmussen
这可能会将重复的数字返回到列表中吗? - Tim Jarvis
那不是问题,蒂姆。这就是随机数的特点 :) 我不介意 - 如果我想避免重复: 我就不会调用普通范围,然后再打乱它。 - CasperT

2
var r = new Random();

var l = Enumerable.Range(0, 10).Select(x => r.Next(100) - 50).ToList();

1
这段代码无法编译。Enumerable.Range需要两个参数 - 开始和计数。你需要将0作为第一个参数传递进去。 - adrianbanks

2
当然,类似于这样的东西...
Random r = new Random();
var ints = Enumerable.Range(0, 50).OrderBy(i => r.Next());

注意,这个更像是洗牌(如果这是你想要的),否则选择是更好的答案。 - Tim Jarvis
请注意,当您获得重复的随机数时,该方法会略有偏差。最好的洗牌方法是Knuth经典算法,在此处描述:http://stackoverflow.com/questions/1262480/how-to-shuffle-a-listt/1262521 - Guffa

1

只是为了增加一种变化,您可以创建一个非常简单的静态方法,如下所示:

    public static IEnumerable<int> RandomSequence(int minValue, int maxValue)
    {
        Random r = new Random();
        while (true)
            yield return r.Next(minValue, maxValue);
    }

然后像这样使用它:

    var numbers = RandomSequence(-50, 50).Take(10));

    foreach(var number in numbers)
        Console.WriteLine(number);

我喜欢 yield return... 嘿嘿 c",)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接