Сортировать список по порядку в другом списке - PullRequest
0 голосов
/ 02 августа 2020

У меня есть 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) . Другими словами, ответ, соответствующий более ранней задаче, должен появиться перед ответом, соответствующим более поздней задаче.

1 Ответ

1 голос
/ 02 августа 2020
var sortedResponses = from nodeResponse in response
                      orderby tasks.FindIndex(t => t.Item2.NodeId == nodeResponse.NodeId)
                      select nodeResponse;

Здесь используется List.FindIndex для поиска индекса первого элемента в списке, соответствующем определенному предикату.

Asymptoti c производительность будет плохой (O(m*n), где m и n обозначают количество элементов в двух списках соответственно), поэтому не используйте это для огромных списков. Если это окажется узким местом производительности, сначала создайте отображение из NodeId s в индексы:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...