从Dictionary(带有元组字符串[])中获取3个随机值,不带重复项

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从Dictionary(带有元组字符串[])中获取3个随机值,不带重复项相关的知识,希望对你有一定的参考价值。

我有以下功能:

private static string[] ReturnAnswers2(string CorrectAnswer, Dictionary<string, Tuple<string, string[]>> AnswerWrongDict, string uniqueKey)
{
    //Get wrong answers from Item2 array and placing 1 CorrectAnswer making sure there are is no duplicated CorrectAnswer.
    string[] result = AnswerWrongDict.OrderBy(n => Guid.NewGuid())
      .Where(n => n.Value.Item2 != null && !n.Value.Item2[0].Equals(CorrectAnswer) && n.Value.Item1 != uniqueKey).Take(3).Select(a => a.Value.Item2[0])
      .Concat(new[] { CorrectAnswer })
      .OrderBy(n => Guid.NewGuid())
      .ToArray();

    return result;
}

字典AnswerWrongDict包含:

  • 第一个字符串:一些名称desc(没有重复,在这里忽略)
  • 元组中的第二个字符串:uniqueKey(无重复)
  • 第三个字符串[]:错误答案的数组(可以是不同的大小甚至是null)

它的作用得到4个答案:3个随机错误答案,1个正确。错误的答案在元组字典中的字符串[]内。

这是有效的,只发出我可以从第三个值字符串[](a.Value.Item2 [0])收到重复的错误答案。

我如何确保3个错误答案中没有重复项?

如果我在Distinct()之后放置.OrderBy(n => Guid.NewGuid())它将删除重复但我有时可以得到3个答案,而我需要4(因为重复区别)。

似乎无法解决这个问题。帮助赞赏。

答案

删除重复的.Take记录后或在选择随机记录之前,您可以排除重复记录。

AnswerWrongDict.OrderBy(r => Guid.NewGuid()).Distinct().Take(4);
另一答案

您应该使用.Take() linq表达式属性

另一答案
AnswerWrongDict.OrderBy(r => Guid.NewGuid()).Distinct().Take(3);

以上是关于从Dictionary(带有元组字符串[])中获取3个随机值,不带重复项的主要内容,如果未能解决你的问题,请参考以下文章

python中的字符串,列表(list),元组,字典(Dictionary)

python 数据类型: 数字Nubmer / 字符串String / 列表List / 元组Tuple / 集合Set / 字典Dictionary

python基础--基本数据类型(Tuple(元组)--不可变数据)

Python列表(list)、元祖(tuple)、集合(set),和字典(dictionary)区别和联系

Dictionary(字典)

从数组中的字典中获取字符串[关闭]