简体   繁体   中英

How do I return the value of a HashSet item instead of the index?

I am creating a HashSet in C# of type int. The HashSet is filled with randomly generated numbers. I'd like to select one of these numbers from the it at random and return it to the user. The problem is, I only see solutions that return the index of the item in the HashSet not the actual value. I'd like to know how I can access the value of my HashSet items.

Here's what I have at the moment, first I create a list from 10 to 20 which forms part of my list control, the reason for this is to set a limit on how many items a list can hold.

List<int> list_length = Enumerable.Range(10, 20).ToList();

I then iterate over list_length and add a random number to my primary list which is called hash_values

private readonly HashSet<int> hash_values = new HashSet<int>();

foreach (var i in list_length)
{

    hash_values.Add(rnd.Next(10, 20));
}

I then access the hash_values list and return a random value from it.

int get_random_number = rnd.Next(hash_values.Count());

return Json(get_random_pin);

You'll notice that the random return is actually selecting a value from the lists total count. This is no use. What I'd like to do is pick an item at random and turn it's value not the index.

Let's say I have a list with 5 values, the hash_values table will store it like this:

[0] 100
[1] 200
[2] 300
[3] 400
[4] 500

Returning something like a random number from the lists total count will only select the index, so I would receive [1] instead of 100 . So, how do I return the value instead of the index?

I would suggest to use the returned index to access the value in the hashset:

int get_random_value = hash_values.ElementAt(rnd.Next(hash_values.Count()));

EDIT:

the reason for this is to set a limit on how many items a list can hold.

you could also simply fix this number in an int and use a normal for loop

int maxNumberOfItems = 10;

for (int i = 0; i < maxNumberOfItems; i++)
{
    hash_values.Add(rnd.Next(10, 20));
}

EDIT 2 Disclaimer:

The approach of using an index on a HashSet is actually counter productive since if you want to access the value the HashSet would do it in O(1) but using the index it will do it in O(n) like it is described in this answer

HashSet is a Set collection. It only implements the ICollection interface. It has great restrictions on individual element access: Compared with List, you cannot use subscripts to access elements, such as list[1]. Because HashSet only saves one item for each piece of data, and does not use the Key-Value method, in other words, the Key in the HashSet is the Value. If the Key is already known, there is no need to query to obtain the Value. All you need to do is check Whether the value already exists.

If you get the index, then you can always to that index and fetch that value and return it. I don't see any harm by doing this.

HashSet is not ordered by nature, but you can always just convert you HashSet to a List or an Array by calling ToList or ToArray respectively.

The other solution with ElementAt will probably work the same, but depending on the implementation details it might not be as efficient as eg array (if it loops through IEnumerable ).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM