从两个列表中的一个

时间:2017-11-12 12:02:54

标签: c# visual-studio

我正在处理从一个或另一个列表中生成随机项目。我有点挣扎如何做到这一点。

基本上我有两个清单:

List<string> names = new List<string>();
List<string> surnames = new List<string>();

我知道如何从一个列表中随机获取一个项目,但我正在努力如何这样做,有可能从名字或姓氏中取一个项目。

我知道可能有一个简单的解决方案,但无法找到它。

任何帮助都将不胜感激。

4 个答案:

答案 0 :(得分:3)

  

我知道如何从一个列表中随机获取一个项目

利用该技术从单个列表中获取随机项,以构建一个适用于两个列表的简单方法。

  • 想象一下,您有一个长度为N = names.Count + surnames.Count
  • 的列表
  • 选择0(包含)和p之间的随机位置N,排除
  • 如果排名p小于names.Count,请使用names[p]
  • 否则,请使用surnames[p - names.Length]

实际上,上述方法从合并列表中选择项目而不执行实际合并。

修改:事实证明您想要names[]surnames[]的随机组合。这是一个更简单的任务,可以通过从数组中选择一个随机元素两次来实现 - 一次从names[]开始,然后再从surnames[]开始。

答案 1 :(得分:2)

这应该做的工作:

Random r = new Random();
Int32 nameIdx = r.Next(names.Count);
Int32 surnameIdx = r.Next(surnames.Count);

String randFullname = names[nameIdx] + " " + surnames[surnameIdx];

这只是向您展示如何使用随机数组访问的示例。如果你只需要选择一个名字或一个姓氏(问题在那一点上并不是很清楚&#34;但我正在努力如何做到这一点,有可能从一个名字或姓氏中取一个项目& #34; ),只需抛出另一个随机[0 1]并根据输出值选择第一个或第二个列表:

List<String> currentList;
String result;

Random r = new Random();

if (rand.Next(0, 2) == 0)
    currentList = names;
else
    currentList = surnames;

Int32 idx = r.Next(currentList.Count);
String result = currentList[idx];

否则,只需从串联中选择一个随机条目:

List<String> con = names.Concat(surnames).ToList();

答案 2 :(得分:0)

您可以合并两个列表并访问随机元素,如下所示,

var newList = names.Concat(surnames).ToList();
Random r = new Random();
string rand = newList[r.Next(newList.Count)];

答案 3 :(得分:-1)

如果您想以单行方式进行,可以尝试以下方法:

var r = new Random();
var randomName = names.Concat(surnames).OrderBy(n => r.Next()).First();

这不是非常有效的记忆,但它应该有用。