我有一本关于餐馆的字典和一种类型的餐馆:Dictionary<Restaurant, string>
餐厅是我的类(class),为简单起见,我使用字符串表示我的餐厅类型。
假设我的列表中有 25 个条目,其中可以有相同类型的 3、4 或 5 家餐厅组。现在我想缩小范围,为每种类型选择 1 个随机元素。
我找到了 this解释如何从字典中选择随机值的页面,但我将如何为每个类型分组选择一个随机条目?
如果我需要详细说明或者您是否需要其他信息,请告诉我!
编辑:我的代码示例:
Dictionary<Restaurant, string> restaurants = new Dictionary<Restaurant, string>();
randomRestaurants.Add(restaurants.GroupBy(x => x.string).//Randomly pick an entry per grouping and add it to list//
List<Restaurant> randomRestaurants = new List<Restaurant>();
例如:可能的类型可以是Italian
, Fast food
和 Sushi
我很抱歉提出了另一个令人困惑的问题。在发布内容之前,我会更加注意。
最佳答案
第一个想法(对于此列表的任何用途)是将您的数据源排序为更合理的格式,即键值结构,其中键类型是标识餐厅子集(字符串)的东西,值是其中的餐厅列表。
您可以使用类似于以下的代码来执行此操作:
var sensibleDict = sillyDict
.GroupBy(kv => kv.Value)
.ToDictionary(
m => m.Key,
m => m.Select(kv => kv.Key).ToList());
现在,我们可以简单地将结果随机化,并在随机化后取第一个将其转换为 Key => Single Value 项。
var randomDict = sillyDict
.GroupBy(kv => kv.Value)
.ToDictionary(
m => m.Key,
m => m.Select(kv => kv.Key)
.OrderBy(k => Guid.NewGuid())
.Take(1)
.First());
这会给你一个 Dictionary<string, Restaurant>
其中第一个字符串是食物的类型(即意大利,寿司),第二个是随机的 Restaurant
.
注意:正如我在评论中所说,如果您的数据集变大,这不是排序列表的最有效方式。有关改组列表的更好方法,请查看 at this answer - Randomise a List .
关于c# - 根据值从字典中选择随机条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40633791/