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

问题描述 投票:0回答: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(因为重复区别)。

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

c# linq
3个回答
0
投票

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

AnswerWrongDict.OrderBy(r => Guid.NewGuid()).Distinct().Take(4);

0
投票

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


0
投票
AnswerWrongDict.OrderBy(r => Guid.NewGuid()).Distinct().Take(3);
© www.soinside.com 2019 - 2024. All rights reserved.