C# 根据字典中相应的ID对对象列表进行排序
我正在尝试使用这个字典对对象列表(树结构)进行排序C# 根据字典中相应的ID对对象列表进行排序,c#,list,sorting,dictionary,tuples,C#,List,Sorting,Dictionary,Tuples,我正在尝试使用这个字典对对象列表(树结构)进行排序 Dictionary<Tuple<int, int>, int?> 我需要整理一份文件 List<DmsSortOrder> 列表 根据上面的字典 Dictionary<Tuple<tagID, objectID>, sortOrder>() Dictionary() 我需要根据字典中的值对对象列表进行排序,但我不确定如何排序。如果重要的话,这个列表实际上是一个列表列表,但是
Dictionary<Tuple<int, int>, int?>
我需要整理一份文件
List<DmsSortOrder>
列表
根据上面的字典
Dictionary<Tuple<tagID, objectID>, sortOrder>()
Dictionary()
我需要根据字典中的值对对象列表进行排序,但我不确定如何排序。如果重要的话,这个列表实际上是一个列表列表,但是一旦我可以对一个分支进行排序,我就可以使用递归对整个列表进行排序
如有任何帮助,将不胜感激。List List;//MyObject具有Id1、Id2
List<MyObject> list; // MyObject has Id1, Id2
Dictionary<Tuple<int, int>, int?> dict;
var sortedObjects =
dict.OrderBy(kvp=>kvp.Value))
.Select(kvp=>
list.Single(obj =>
obj.Id1 == kvp.Key.Item1
&& obj.Id2 == kvp.Key.Item2
)
);
词典词典;
分类对象变量=
dict.OrderBy(kvp=>kvp.Value))
.选择(kvp=>
list.Single(obj=>
obj.Id1==kvp.Key.Item1
&&obj.Id2==kvp.Key.Item2
)
);
给定这些变量:
List<UniqueObject> list;
Dictionary<Tuple<int, int>, int?> sortOrders;
我相信有很多方法可以优化这个问题,但总体思路相当简单。我想您需要这样一个查询:
var sortedList = list.OrderBy(obj => sortOrders[new Tuple(obj.Id1, obj.Id2)]).ToList();
lists = lists
.Select(list => list
.Select(x => new {Key = Tuple.Create(x.TagID, x.ObjectID), DmsSortOrder = x})
.OrderBy(x => dict.ContainsKey(x.Key) ? dict[x.Key] : int.MaxValue)
.Select(x => x.DmsSortOrder)
.ToList())
.ToList();
如果不想在末尾看到未知对象,请更改值
int.MaxValue
。如果要根据字典中的值对列表进行排序,可以执行以下操作:
List<DmsSortOrder> list = ...
Dictionary<Tuple<int, int>, int> sortOrder = ...
list.Sort((x, y) => sortOrder[Tuple.Create(x.TagID, x.ObjectID)] -
sortOrder[Tuple.Create(y.TagID, y.ObjectID)]);
//or
list = list.OrderBy(o => sortOrder[Tuple.Create(o.TagID, o.ObjectID)]).ToList();
List=。。。
字典排序器=。。。
list.Sort((x,y)=>sortOrder[Tuple.Create(x.TagID,x.ObjectID)]-
排序器[Tuple.Create(y.TagID,y.ObjectID)];
//或
list=list.OrderBy(o=>sortOrder[Tuple.Create(o.TagID,o.ObjectID)]).ToList();
只需使用SortedDictionary
就能解决这个问题吗?@stephen.vakil我不这么认为。。我的原始问题是否不清楚,或者人们浏览的速度过快?您可以使用字典在类中继承IComparable,然后添加您自己的自定义CompareTo()方法进行排序。我想我现在明白您的问题了,请查看我的更新答案。但是,如果您发布了一个包含数据结构的对象示例,以及该对象定义的相关部分,以显示问题是如何成为复合标识符的,那就更清楚了。@Gerino我意识到这一点。OP更新了!我不想把字典分类。我需要对对象列表进行排序,其中对象的ID包含在ObjectID元组字典中,以及它们的排序顺序使用排序顺序作为值。您创建了许多不必要的元组!这么多被浪费的字节,不会用在阿波罗时代的太空火箭上;)是的,我不否认。不要觉得没有上下文就需要立即优化它。也许我们谈论的是100件物品我忘了提;字典包含多个列表的排序顺序,因此我不能简单地对字典排序,然后按排序顺序从列表中选择元素。由于缺乏经验,我也很难阅读您的LINQ查询。这样做了吗?我在第一个select语句中也得到了一个类型推断错误。“尝试显式指定类型参数”我把这个问题搞砸了。排序也需要到位,因为列表包含自己的列表。它是一个树形结构。
List<DmsSortOrder> list = ...
Dictionary<Tuple<int, int>, int> sortOrder = ...
list.Sort((x, y) => sortOrder[Tuple.Create(x.TagID, x.ObjectID)] -
sortOrder[Tuple.Create(y.TagID, y.ObjectID)]);
//or
list = list.OrderBy(o => sortOrder[Tuple.Create(o.TagID, o.ObjectID)]).ToList();