我需要将小字典集合中的值(10个项目)分配给所选值属性中较大数量(约20到30个)的下拉列表。
具体来说,我需要在字典中获取 max value 的键,并将其分配给第一个dropdownlist.selected值。 然后取第二个最高值的键,将其分配给第二个下拉列表。 当我浏览字典中的所有键/值(并且仍然需要分配下拉列表)时,我需要使用字典中最大值的键从顶部开始。
我能够得到最大值的关键字。
var maxKey =
results
.Aggregate((left, right) => left.Value > right.Value ? left : right).Key;
ddlItem.SelectedValue = maxKey.ToString();
我原来做的是,我在分配后删除了maxvalue。但我忘了会有比实际字典值更多的下拉列表。我猜测解决方案是使用不同的临时集合并使用它?任何帮助表示赞赏。
如果需要使用列表,我如何将字典传输到列表并使用索引,键和值?
答案 0 :(得分:2)
您可以使用OrderByDescending
按值降序获取键值对,例如
var d = new Dictionary<int, string>();
var orderedKeyValuePairs = d.OrderByDescending(kvp => kvp.Value);
在此示例中,orderedKeyValuePairs
是IOrderedEnumerable<KeyValuePair<int, string>>
为了便于分配您的下拉列表,您可以创建一个包装队列的实用程序类,如下所示:
public class KVPCycle
{
Queue<KeyValuePair<int, string>> queue;
public KVPCycle(IEnumerable<KeyValuePair<int, string>> items)
{
queue = new Queue<KeyValuePair<int, string>>(items);
}
public KeyValuePair<int, string> Next()
{
var item = queue.Dequeue();
queue.Enqueue(item);
return item;
}
}
你可以像这样使用它:
var cycle = new KVPCycle(d.OrderByDescending(kvp => kvp.Value));
// Loop over your dropdown lists
for each dropdown list
var kvp = cycle.Next();
// Get the key
int key = kvp.Key;
// Get the value
string val = kvp.Value;
// Now assign to your dropdown
// ...
通过这种方式,一旦你到达有序列表的末尾,你将自动重新开始 - 值会循环旋转。
答案 1 :(得分:1)
您是否尝试创建按值排序(DESC)的IEnumerable密钥?
修改的
最简单的方法是:
var seq = d.OrderByDescending(kvp => kvp.Value).Select(kvp => kvp.Key);
d
是您的Dictionary<string,int>
。 OrderByDescending
通过递减值对键值对进行排序,Select
从对中提取键。结果是IEnumerable<string>
完全按照您想要的顺序。
此时,您可以在其上运行foreach
,或者我想您也可以将其加载到Queue
中,如另一个示例所示。
(以上也可以用更多SQL-ish语法完成,但我没有看到重点。)
答案 2 :(得分:0)
您应该对列表进行降序排序,然后您可以将第一个值分配给第一个控件,将第二个值分配给第二个控件,依此类推索引。
希望有所帮助!