gpt4 book ai didi

c# - 在集合/对象初始值设定项中使用 Random.Next()

转载 作者:行者123 更新时间:2023-11-30 14:00:55 31 4
gpt4 key购买 nike

谁能解释为什么下面的代码在运行时偶尔会产生一些“NULL!”正在写入控制台窗口的字符串?

(这是TL;DR 问题,请继续阅读以获取更多详细信息)

这不会每次都发生,您可能需要运行此代码几次,但很快,您就会看到一串“NULL!”输出到控制台窗口而不是数字。

本质上,它正在初始化(使用速记集合初始化语法)用户定义类型的通用集合 (List<Thing>),其中包含一个属性,该属性是对另一个用户定义类型 (Numb) 的引用。 Numb在它自己的集合中预定义 ( nnn ) 并且该集合中的对象是使用来自 within 的集合初始化程序的速记对象初始化程序语法创建的,该集合初始化程序使用 lambda 来选择基于这是唯一num属性(property)。

nnn.Where(n => n.num==rnd.Next(1,3)).FirstOrDefault()永远不应该返回 NULL对象(即 FirstOrDefault() 的默认部分)作为随机数应该只选择 1 或 2,这两者都存在于 nnn 中收藏。

我的怀疑告诉我,这与使用对 rnd.Next() 的调用(特别是 多次 调用)有关。在对象/集合初始化程序场景中。

代码(作为控制台应用程序运行):

using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Random rnd = new Random();

var nnn = new List<Numb> {
new Numb() {
num = 1
},
new Numb() {
num = 2
}
};

new List<Thing> {
new Thing() {
numb = nnn.Where(n => n.num==rnd.Next(1,3)).FirstOrDefault()
},
new Thing() {
numb = nnn.Where(n => n.num==rnd.Next(1,3)).FirstOrDefault()
},
new Thing() {
numb = nnn.Where(n => n.num==rnd.Next(1,3)).FirstOrDefault()
},
new Thing() {
numb = nnn.Where(n => n.num==rnd.Next(1,3)).FirstOrDefault()
}
}.ForEach(t => Console.WriteLine(t.numb!=null ? t.numb.num.ToString() : "NULL!"));

Console.ReadLine();
}
}

public class Thing
{
public Numb numb { get; set; }
}

public class Numb
{
public int num {get; set; }
}
}

最佳答案

您在谓词的每次测试 上生成不同的随机数。所以只看一部分:

new Thing() {
numb = nnn.Where(n => n.num==rnd.Next(1,3)).FirstOrDefault()
}

这将:

  • 开始迭代,获取第一个 Numb - 我们称它为 n1
  • 生成一个随机数,1 或 2 - 我们称之为 x
  • 检查是否n1.num == x,如果是则yield
  • 假设上一步匹配,它将...
    • 继续迭代,得到第二个Number - 我们称之为n2
    • 生成另一个随机数,1 或 2 - 让我们称之为 y
    • 检查是否n2.num == y,如果是则yield
    • 假设上一步没有匹配,它将返回null

换句话说,您查询的是一个移动的目标。您想要生成一个 随机数,然后针对所有 值进行测试。 (然后对集合初始值设定项的每个成员重复。)

关于c# - 在集合/对象初始值设定项中使用 Random.Next(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9501384/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com