Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 根据字典中相应的ID对对象列表进行排序_C#_List_Sorting_Dictionary_Tuples - Fatal编程技术网

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();