2017-03-13 1 views
0

J'ai une liste de sous-listes avec numéro indexé apparié et sa valeur binaire. Par exemple:Faire la liste des numéros de paired en C#

Variable  Value  
route.x[0,0]  0 
route.x[0,1]  1 
route.x[0,2]  0 
route.x[0,3]  0 
route.x[1,0]  0 
route.x[1,1]  0 
route.x[1,2]  0 
route.x[1,3]  1 
route.x[2,0]  0 
route.x[2,1]  0 
route.x[2,2]  0 
route.x[2,3]  0 
route.x[3,0]  0 
route.x[3,1]  0 
route.x[3,2]  1 
route.x[3,3]  0 

Si la valeur de route.x[i,j] est 1, puis faire une nouvelle liste qui contient ce numéro dans l'ordre. Pour cet exemple, la nouvelle liste sera: route = 0 1 3 2

Jusqu'à présent, j'ai fait ce code:

//find optimal route 
var route = new List<List<int>>(); 
for (int j = 0; j < C+1; ++j) 
{ 
    if (routeopt.x[0, j] != 1) 
    continue; 
    List<int> subroute = new List<int>(); 
    subroute.Add(0); 
    subroute.Add(j); 
    route.Add(subroute); 
} 

résultat de ce code est route = 0 1. Après cela, j'utilise ce code pour ajouter un nouveau numéro (3 et 2).

for (int i = 1; i < C+1; ++i) 
{ 
    for (int j = 1; j < C+1; j++) 
    { 
     if (routeopt.x[i, j] == 1) 
     { 
      List<int> targetlist = route.Single(r => r.Contains(i)); 
      targetlist.Add(j); 
     } 
    } 
} 

Ce code est travaillé si seulement j'ai une route.x [i, j] avec la valeur 1 en nombre ordonné. Mais si ce n'est pas commandé, par exemple (je montre seule variable avec la valeur 1):

Variable  Value  
route.x[0,4]  1 
route.x[0,3]  1 
route.x[4,1]  1 
route.x[1,2]  1 

Il devrait être route = 0 3 et route = 0 4 1 2. Mais il a montré Sequence contains no matching element parce que l'index 1 n'est pas contenu dans route = 0 3 ou route = 0 4. Comment gérer ce problème? Merci

Répondre

0

Je l'ai déjà trouvé par moi-même. Après avoir obtenu la première partie, j'utilise ce code pour ajouter un nouveau numéro. Voici mon code:

foreach (var subroute in route) 
{ 
    int r = 0; 
    while (r != subroute[subroute.Count - 1]) 
    { 
     r = subroute[subroute.Count-1]; 
     for (int j = 1; j < C + 1; j++) 
     { 
      if (routeopt.x[r, j] == 1) 
       subroute.Add(j); 
     } 
    } 
} 
-1

La méthode Single s'attend à ce qu'il y ait exactement 1 valeur de retour. sinon, il va lancer une exception.

Essayez SingleOrDefault. Cela renverra null s'il n'y a aucun élément trouvé.

List<int> targetlist = route.SingleOrDefault(r => r.Contains(i)); 
if(targetList != null) 
    targetlist.Add(j); 

Edit:

Cela encore plantage s'il y a 2 listes qui contiennent i. Pour éviter cela, vous pouvez utiliser FirstOrDefault

0

Essayez le code ci-dessous. Il renvoie la liste de toutes les routes. La liste d'int a l'itinéraire dans l'ordre inverse ainsi pendant l'affichage/l'utilisation vous devriez prendre soin de lui.

const int C = 4; 
static int[,] route_x = new int[5, 5]; 

static void Main(string[] args) 
{ 
    var allRoutes = FindRoutes(); 
    System.Console.ReadLine(); 
} 

private static List<List<int>> FindRoutes() 
{ 
    route_x[0, 0] = 0; 
    route_x[0, 1] = 1; 
    route_x[0, 2] = 0; 
    route_x[0, 3] = 0; 
    route_x[1, 0] = 0; 
    route_x[1, 1] = 0; 
    route_x[1, 2] = 0; 
    route_x[1, 3] = 1; 
    route_x[2, 0] = 0; 
    route_x[2, 1] = 0; 
    route_x[2, 2] = 0; 
    route_x[2, 3] = 0; 
    route_x[3, 0] = 0; 
    route_x[3, 1] = 0; 
    route_x[3, 2] = 1; 
    route_x[3, 3] = 0; 
    route_x[0, 4] = 1; 
    route_x[0, 3] = 1; 
    route_x[4, 1] = 1; 
    route_x[1, 2] = 1; 

    var routes = new List<List<int>>(); 
    for (int i = 0; i < C + 1; i++) 
    { 
     if (route_x[0, i] == 1) 
     { 
      var subroutes = FindNextRoute(i); 
      foreach (var item in subroutes) 
      { 
       item.Add(0); 
       routes.Add(item); 
      } 
     }      
    } 

    return routes; 
} 

private static List<List<int>> FindNextRoute(int i) 
{ 
    var subroute = new List<List<int>>(); 
    bool found = false; 
    for (int j = 0; j < C + 1; j++) 
    { 
     if (route_x[i, j] == 1) 
     { 
      found = true; 
      var tempRoutes = FindNextRoute(j); 
      foreach(var item in tempRoutes) 
      { 
       item.Add(i); 
       subroute.Add(item); 
      } 
     }      
    } 

    if (!found) 
    { 
     var singleitem = new List<int>(); 
     singleitem.Add(i); 
     subroute.Add(singleitem); 
    } 

    return subroute; 
}