【问题标题】:Make list of number from paired number in C#从C#中的配对号码中制作号码列表
【发布时间】:2017-03-13 13:57:32
【问题描述】:

我有一个带有成对索引号及其二进制值的子列表列表。例如:

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

如果我有一个 route.x[i,j] 在有序数中值为 1,则此代码有效。但是如果它没有排序,例如(我只显示值为 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,因为索引1 不包含在route = 0 3route = 0 4 中。如何处理这个问题?谢谢

【问题讨论】:

    标签: c# list contains


    【解决方案1】:

    试试下面的代码。它返回所有路线的列表。 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;
    }
    

    【讨论】:

      【解决方案2】:

      我自己已经找到了。得到第一部分后,我使用此代码添加新号码。这是我的代码:

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

      【讨论】:

        【解决方案3】:

        Single 方法期望恰好有 1 个返回值。否则会抛出异常。

        试试SingleOrDefault。如果没有找到元素,这将返回 null

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

        编辑:

        如果有 2 个列表包含 i,这仍然会崩溃。 为避免这种情况,您可以使用FirstOrDefault

        【讨论】:

          猜你喜欢
          • 2021-08-07
          • 1970-01-01
          • 2023-01-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-04-21
          • 1970-01-01
          相关资源
          最近更新 更多