从另一个词典中的键排序字典

本文关键字:排序 字典 另一个 | 更新日期: 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 映射或筛选或对其执行所需的任何其他操作。将项目添加到字典时,将根据给定TKeyICompare<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,它的存在正是为了这个目的。