Как использовать список <Кортеж>[] в C #?

#c# #graph-theory

#c# #теория графов

Вопрос:

у меня есть такой метод:

ребра такие

4 это количество узлов

1 2 1 первые два значения — это вершины, а третий элемент — это вес ребер

4 1 2

2 3 2

1 3 5

 public static List<Tuple<long,long>>[] WeightedGraph(long NodeCount,long[][] edges)
{
    List<Tuple<long, long>>[] Weightedgraph = new List<Tuple<long, long>>[NodeCount   1];
    for(int i=0; i<Weightedgraph.Length;i  )
    {
        Weightedgraph[i] = new List<Tuple<long, long>>();
    }
    foreach(var vertex in edges)
    {
        **Weightedgraph[vertex[0]].Add();**
    }
}
  

как я могу завершить ** часть?

Комментарии:

1. Просто пример Weightedgraph[0].Add(new Tuple(1, 2));

2. что вы ожидаете добавить к Weightedgraph[vertex[0]]

3. первый узел всегда является начальным, и я реализую его с помощью списка<Tuple<long, long>>[], где индексы массива, показывающие начальные узлы, и 2 других свойства будут добавлены в список tuple<long,long> элемент 1 — это другой узел, а элемент 2 — это вес.

4. Если вы хотите использовать информацию о ребрах позже, я бы предложил сделать .ToLookup() , чтобы вы могли легко получить доступ ко всем ребрам данной вершины

Ответ №1:

Самый простой способ — использовать Tuple.Create(long, long) :

 public static List<Tuple<long, long>>[] WeightedGraph(long NodeCount, long[][] edges)
{
    List<Tuple<long, long>>[] weightedgraph = new List<Tuple<long, long>>[NodeCount   1];

    for (int i = 0; i < weightedgraph.Length; i  )
    {
        weightedgraph[i] = new List<Tuple<long, long>>();
    }

    foreach (var vertex in edges)
    {
        weightedgraph[vertex[0]].Add(Tuple.Create(1L, 2L));
    }

    return weightedgraph;
}
  

Однако обратите внимание, что для C # версии 7 или более поздней вы можете использовать синтаксис (x, y) «кортеж значений», чтобы упростить работу и предоставить более значимые имена для элементов кортежа.

В примере ниже я изменил ваш код для вызова элементов кортежа X и Y:

 public static List<(long X, long Y)>[] WeightedGraph(long nodeCount, long[][] edges)
{
    var weightedgraph = new List<(long X, long Y)>[nodeCount   1];

    for (int i = 0; i < weightedgraph.Length; i  )
    {
        weightedgraph[i] = new List<(long X, long Y)>();
    }

    foreach (var vertex in edges)
    {
        weightedgraph[vertex[0]].Add((1L, 2L));
    }

    return weightedgraph;
}
  

Комментарии:

1. Я полагаю, вам следует упомянуть, что он известен как кортеж значений и доступен с C # 7

Ответ №2:

Давайте добавим удобочитаемость (какой индекс что означает):

 // I've changed NodeCount into int: 
// do you really want a graph with more than 2e9 vertexes?
public static List<Tuple<long,long>>[] WeightedGraph(int NodeCount, long[][] edges) {
  //TODO: validate NodeCount and edges

  // Naming: "WeightedGraph" is the method's name; "result" is what we return 
  // Initialization: we want
  List<Tuple<long, long>>[] result = Enumerable
    .Range(0, NodeCount)                            // NodeCount vertexes
    .Select(node => new List<Tuple<long, long>>())  //   Each has a List<T> of edges
    .ToArray();                                     // Organized as an array

  foreach (var edge in edges) {
    // Let's add readability end decrypt edges format
    int vertexFrom = (int) (edge[0]);
    long vertexTo = edge[1];
    long edgeWeight = edge[2];

    result[vertexFrom].Add(Tuple.Create(vertexTo, edgeWeight)); 
  }  

  return resu<
}