从另一个词典中的键排序字典
本文关键字:排序 字典 另一个 | 更新日期: 2023-09-27 18:33:47
>我有两个字典:
Dictionary<string, Tuple<T, T>> dict1
Dictionary<Enum, Tuple<string, DateTime, DateTime>> dict2
元组中第一项中的字符串值有时等于第一个字典中的键。我想按枚举值对第二个字典进行排序,然后根据 dict2 的顺序对第一个字典进行排序。如何在保留 dict1 中可能存在的其他密钥的同时执行此操作?我能够对字典进行排序。
var positions = new Dictionary<Enum, string>();
//This foreach loop can be simplified by a linq expression.
foreach (var position in dict2)
{
var isFound = dict1.Any(x => x.Key == position.Value.Item1.Value);
if (isFound)
{
clubPositions.Add(position.Key, position.Value.Item1.Value);
}
}
var sortedPositions = positions.OrderByDescending(x => x.Key);
您正在查找 MSDN 上记录的SortedDictionary
。您需要按以下方式实例化它们:
var dict1 = new SortedDictionary<string, Tuple<DateTime, DateTime>>();
var dict2 = new SortedDictionary<Enum, Tuple<string, DateTime, DateTime>>();
拥有排序的字典实例后,可以使用 LINQ 映射或筛选或对其执行所需的任何其他操作。将项目添加到字典时,将根据给定TKey
的ICompare<T>
(如果未明确提供,则默认IComparer
)自动对项目进行排序。
一个缺点是,这种排序仅基于键,没有基于值排序的概念。
我理解这个问题的方式不是对第一个字典进行排序,而是能够按照第二个字典键定义的顺序迭代其元素。如果这是正确的,以下方法应该可以解决问题:
var orderedKeys = new HashSet<string>(dict2.OrderBy(e => e.Key).Select(e => e.Value.Item1));
var orderedEntries = orderedKeys.Where(dict1.ContainsKey)
.Select(key => new KeyValuePair<string, Tuple<T, T>>(key, dict1[key]))
.Concat(dict1.Where(e => !orderedKeys.Contains(e.Key)));
请注意,它会将没有相应键的条目放在顺序的最后。
您不能对字典进行排序,因为它使用哈希算法进行常量搜索。
常规字典无法排序。你可以使用SortedDictionary,它的存在正是为了这个目的。