根据另一个列表的顺序对列表进行排序

时间:2020-08-02 16:36:53

标签: c# linq

我有一个List<Tuple<string, Node>>和一个List<NodeResponse>NodeNodeResponse都包含NodeId

以下是使用的确切数据结构:

class Node
{
    public string Name { get; set; }
    public string SoftwareVersion { get; set; }
    public string NodeId { get; set; } 
}

class NodeResponse
{
    public bool Status { get; set; }
    public string Message { get; set; }
    public string NodeId { get; set; }
    public string Key { get; set; }
}

List<Tuple<string, Node> tasks = new List<Tuple<string, Node>>();

List<NodeResponse> responses = new List<NodeResponse>();

我希望responses由另一个列表(NodeId)中tasks位置排序。换句话说,对应于较早任务的响应应该出现在对应于较后任务的响应之前。

1 个答案:

答案 0 :(得分:1)

var sortedResponses = from nodeResponse in response
                      orderby tasks.FindIndex(t => t.Item2.NodeId == nodeResponse.NodeId)
                      select nodeResponse;

这使用List.FindIndex在列表中找到与某个谓词匹配的第一个元素的索引。

渐近性能会很差(O(m*n),其中mn分别表示两个列表中的项目数),因此不要在庞大的列表中使用它。如果发现这是性能瓶颈,请首先创建从NodeId到索引的映射:

var nodeIdToIndex = 
    tasks.Select(t => t.Item2.NodeId).Distinct().
    ToDictionary(nodeId => nodeId,
                 nodeId => tasks.FindIndex(t => t.Item2.NodeId == nodeId));

var sortedResponses = 
    from nodeResponse in response
    orderby nodeIdToIndex[nodeResponse.NodeId]
    select nodeResponse;