我有一个List<Tuple<string, Node>>
和一个List<NodeResponse>
。 Node
和NodeResponse
都包含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
的位置排序。换句话说,对应于较早任务的响应应该出现在对应于较后任务的响应之前。
答案 0 :(得分:1)
var sortedResponses = from nodeResponse in response
orderby tasks.FindIndex(t => t.Item2.NodeId == nodeResponse.NodeId)
select nodeResponse;
这使用List.FindIndex在列表中找到与某个谓词匹配的第一个元素的索引。
渐近性能会很差(O(m*n)
,其中m
和n
分别表示两个列表中的项目数),因此不要在庞大的列表中使用它。如果发现这是性能瓶颈,请首先创建从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;