2017-03-13 5 views
0

インデックス付きの数値とそのバイナリ値を持つサブリストのリストがあります。たとえば: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 

route.x[i,j]の値が1である場合には、順番にその番号を含む新しいリストを作ります。その例えば、新たなリストは次のようになります。

route = 0 1 3 2はこれまでのところ、私はこのコードを作っています

//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); 
} 

このコードの結果はroute = 0 1です。その後、このコードを使用して新しい番号(32)を追加します。

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); 
     } 
    } 
} 

このコードは、注文番号に値1のroute.x [i、j]がある場合にのみ機能します。しかし、それは(私は唯一の値1を持つ変数を表示)例えば、注文されていない場合:

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

それはroute = 0 3route = 0 4 1 2でなければなりません。しかし、Sequence contains no matching elementと表示されたのは、1route = 0 3またはroute = 0 4に含まれていないためです。どのようにその問題を処理する?ありがとう

答えて

0

私はすでにそれを見つけました。私は最初の部分を取得した後、私はこのコードを使用して新しい番号を追加します。ここに私のコードです:

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

Singleメソッドは、正確に1の戻り値があると想定しています。それ以外の場合は例外がスローされます。

Try SingleOrDefault要素が見つからない場合はnullが返されます。

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

編集:

iが含まれている2つのリストがある場合、これはまだクラッシュします。このおFirstOrDefault

0

コードの下に試してみてくださいを使用することができないようにするに 。すべてのルートのリストを返します。 intのリストには逆順のルートがあるので、表示/使用している間はそれを処理する必要があります。

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; 
} 
関連する問題