How to get a Random Object using Linq

前端 未结 9 1508
心在旅途
心在旅途 2020-12-29 02:34

I am trying to get a random object within linq. Here is how I did.

//get all the answers
var Answers = q.Skip(1).Take(int.MaxValue);
//get the random number         


        
9条回答
  •  抹茶落季
    2020-12-29 03:30

    What about:

    SelectedPost = q.ElementAt(r.Next(1, Answers.Count()));
    

    Further reading:

    The comments below make good contributions to closely related questions, and I'll include them here, since as @Rouby points out, people searching for an answer to these may find this answer and it won't be correct in those cases.

    Random Element Across Entire Input

    To make all elements a candidate in the random selection, you need to change the input to r.Next:

    SelectedPost = Answers.ElementAt(r.Next(0, Answers.Count()));
    

    @Zidad adds a helpful extension method to get random element over all elements in the sequence:

    public static T Random(this IEnumerable enumerable)
    {
        if (enumerable == null)
        {
             throw new ArgumentNullException(nameof(enumerable));
        }
    
        // note: creating a Random instance each call may not be correct for you,
        // consider a thread-safe static instance
        var r = new Random();  
        var list = enumerable as IList ?? enumerable.ToList(); 
        return list.Count == 0 ? default(T) : list[r.Next(0, list.Count)];
    }
    

提交回复
热议问题