C# 对字符对进行排序,以形成';相对长度单位?

C# 对字符对进行排序,以形成';相对长度单位?,c#,sorting,C#,Sorting,我正在为我朋友的应用程序创建一个方法,返回车辆的路线。 例如,总线1有路由A-to-B、B-to-C、C-to-D,最后还有一对,其端部是单独的,就像第一对的A一样 查询返回的结果是混乱的,因为每辆车的路线顺序不同,所以我尝试编写一个方法,对这些组合进行排序以生成路径。就像一条链子。我在这里使用字符作为位置,字符串作为路由 public void MakePath(ref List<string> routes) { for (int i = 0; i

我正在为我朋友的应用程序创建一个方法,返回车辆的路线。 例如,总线1有路由A-to-B、B-to-C、C-to-D,最后还有一对,其端部是单独的,就像第一对的A一样

查询返回的结果是混乱的,因为每辆车的路线顺序不同,所以我尝试编写一个方法,对这些组合进行排序以生成路径。就像一条链子。我在这里使用字符作为位置,字符串作为路由

    public void MakePath(ref List<string> routes)
    {
        for (int i = 0; i < routes.Count - 1; i++)
        {
            for (int j = 0; j < routes.Count; j++)
            {
                if (routes[i][1] == routes[j][0])
                {
                    var temp = routes[i + 1];
                    routes[i + 1] = routes[j];
                    routes[j] = temp;
                    j = routes.Count;
                }
            }
        }
    }
public void MakePath(参考列表路由)
{
对于(int i=0;i
在某些情况下,也就是说,如果最后一对已经在正确的位置上,它可以正常工作。 例如,否则它就不起作用

“CD”“AB”“BC”


这个不行。我知道它不起作用,因为第一个字符串的第二个字符是单独的,因为它应该是最后一对,所以我应该在这个方法中做什么来处理最后一对呢?

您必须首先扫描列表并找到路线的终点站。在其最简单的形式中,这是路径大小的二次算法

之后,可以将管线的终端段放置在正确的位置。然后运行你的算法“熨”中间的东西

public void MakePath(ref List<string> routes)
{
    bool is_first, is_last;
    for (int i = 0; i < routes.Count - 1; i++)
    {
        is_first = true;
        is_last = true;
        for (int j = 0; j < routes.Count; j++)
        {
             if (routes[i][1] == routes[j][0]){
                is_last = false;
                break;
             }
             if (routes[i][0] == routes[j][1]){
                is_start = false;
                break;
             }
        }
        if (is_first) {
             var temp = routes[i];
             routes[i] = routes[0];
             routes[0] = temp;
        }
        if (is_last) {
             var temp = routes[i];
             routes[i] = routes[routes.Count];
             routes[routes.Count] = temp;
        }
     }           
    for (int i = 0; i < routes.Count - 1; i++)
    {
        for (int j = 0; j < routes.Count; j++)
        {
            if (routes[i][1] == routes[j][0])
            {
                var temp = routes[i + 1];
                routes[i + 1] = routes[j];
                routes[j] = temp;
                j = routes.Count;
            }
        }
    }
}
public void MakePath(参考列表路由)
{
布尔在前,在后;
对于(int i=0;i
您只需在运行前对列表进行排序,然后确保从正确的路线开始:

public void MakePath(ref List<string> routes)
        {
            routes.Sort(); //just insert here
            for (int i = 0; i < routes.Count - 1; i++)
            {
                for (int j = 0; j < routes.Count; j++)
                {
                    if (routes[i][1] == routes[j][0])
                    {
                        var temp = routes[i + 1];
                        routes[i + 1] = routes[j];
                        routes[j] = temp;
                        continue;
                    }
                }
            }
        }
public void MakePath(参考列表路由)
{
routes.Sort();//只需在此处插入
对于(int i=0;i
您能提供routes列表的值以及您期望的结果吗?它的字符类似于字符串route1=“CD”;string route2=“AB”'string route3=“BC”:我希望输出为排序列表,“AB”、“BC”、“CD”是的,对不起,我无意中按了enter。好的。我认为你需要做的第一件事是确保所有的路线都是连通的。i、 e.如果您有类似“AB”“BC”“DE”的内容,则抛出异常。第二,知道所有端点都是连接的,搜索端点候选者。在你的例子中,if将是D,因为没有这样的路由从D开始。startpoints也是如此。我想我明白了,但在代码中,你只是把起始终端放在它的位置,我也需要把结束终端放在它的正确位置,对吗?顺便说一句,这使得它更复杂,我必须迭代3个嵌套循环。我希望有另一个解决方案:sI已经更新了帖子,以描述如何在同一个循环中找到结束终端。然而,最后一对将由您的算法定位,因此不需要在第一条路径中找到它。我不需要按字母顺序对它们进行排序,路径可能是ZA-AX-XD,我只需要将它们链接起来。如果我使用list.Sort()对它们进行排序,它将是AX-XD-ZA,而这也不会起作用。