根据字典中对应的ID对对象列表进行排序

时间:2016-04-14 15:20:09

标签: c# list sorting dictionary tuples

我正在尝试使用此词典对对象列表(树结构)进行排序;

Dictionary<Tuple<int, int>, int?>

元组包含两个ID,用于标识唯一对象。值是排序顺序。

该对象具有与

类似的结构
public class DmsSortOrder : IRecord
{
    public int TagID { get; set; }

    public int ObjectID { get; set; }

    public int? Order { get; set; }
}

我需要排序

List<DmsSortOrder>

根据上面的词典。

Dictionary<Tuple<tagID, objectID>, sortOrder>()

我需要根据字典中的值对对象列表进行排序,但我不确定如何。如果重要的话,列表实际上是一个列表列表,但是一旦我可以对一个分支进行排序,我觉得使用递归对整个List进行排序很舒服。

任何帮助都将不胜感激。

4 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

鉴于这些变量:

List<UniqueObject> list;
Dictionary<Tuple<int, int>, int?> sortOrders;

你应该得到这样的东西:

var sortedList = list.OrderBy(obj => sortOrders[new Tuple(obj.Id1, obj.Id2)]).ToList();

我确信有很多方法可以优化它,但总体思路相当简单。

答案 2 :(得分:0)

我想你想要这样的查询:

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

答案 3 :(得分:0)

如果要根据字典中的值对列表进行排序,可以这样做:

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