C# 从嵌套的子类中获取随机值
我的程序中有一个如下所示的对象:C# 从嵌套的子类中获取随机值,c#,C#,我的程序中有一个如下所示的对象: var allNode = new NodeClass() { Id = 1, Node = new NodeClass() { Id = 2, Node = new NodeClass() { Id = 3,
var allNode = new NodeClass()
{
Id = 1,
Node = new NodeClass()
{
Id = 2,
Node = new NodeClass()
{
Id = 3,
Node = new NodeClass()
{
Id = 4,
Node = new NodeClass()
{
Id = 5,
Node = new NodeClass()
{
Id = 6
}
}
}
}
}
};
现在我想得到一个随机的子对象,并获得对Id值的访问。
我想到的是:
var listOfNodes = new List<NodeClass>()
{
allNode,
};
var lastNode = allNode;
while (true)
{
lastNode = lastNode.Node;
if (lastNode != null)
{
listOfNodes.Add(lastNode);
}
else
{
break;
}
}
Console.WriteLine("Random Node: ");
Console.WriteLine(listOfNodes.OrderBy(x=> Guid.NewGuid()).First().Id);
我想知道有没有更好的方法来实现这一点?在某处创建Random类的实例。请注意,每次需要一个随机数时,不要创建一个新实例,这一点非常重要。您应该重用旧实例,以实现生成的数量的一致性。您可以在某个地方有一个静态字段。注意线程安全问题
static Random rnd = new Random();
要求Random实例为您提供一个随机数,该随机数为ArrayList中项目数的最大值
int r = rnd.Next(list.Count);
显示字符串
MessageBox.Show((string)list[r]);
除非您保留一个节点有多少链接子节点的计数器,否则我看不到更好的实现方法。但是,您不必要地向Linq订购。如果只需要一个节点,则列表中的Random.NextInt就足够了。但是,如果要“随机选择当前节点”,则可以遍历所有节点并对每个节点进行随机检查。我不确定这个解决方案会有多可靠。