【问题标题】:Sorting a list in c# (custom defined sorting rules)在c#中对列表进行排序(自定义排序规则)
【发布时间】:2018-10-19 19:51:30
【问题描述】:

我有一个名为 choosedGroupList 的字符串列表,由 5 个项目组成。每个项目代表一个组,
例如:L1andL4 表示 L1 将与 L4 分组。
另一个例子:L1,L4andL5,L6 表示 L1,L4 组将与 L5,L6 组分组

我正在尝试将此列表排序为:

L1和L4
L5和L6
L1,L4和L5,L6
L2和L1,L4,L5,L6
L3和L2,L1,L4,L5,L6

所以我写了这段代码来执行这个任务,

 //sorting choosedGroupList
        for (int k = 0; k < choosedGroupList.Count; k++)
        {
            for (int j = k + 1; j < choosedGroupList.Count; j++)
            {
                string[] parts = choosedGroupList[j].Split(new string[] { "and" }, StringSplitOptions.None);
                if (parts[0] == choosedGroupList[k].Replace("and", ",") || parts[1] == choosedGroupList[k].Replace("and", ","))
                {
                    string[] parts2 = choosedGroupList[k + 1].Split(new string[] { "and" }, StringSplitOptions.None);
                    //if (parts[0] != parts2[0] || parts[1] != parts2[1])
                    //{
                        String Temp = choosedGroupList[k + 1];
                        choosedGroupList[k + 1] = choosedGroupList[j];
                        choosedGroupList[j] = Temp;
                    //}
                }
            }
        }

我在代码中没有例外,但是我没有得到想要的结果。

执行代码后,结果如下:

L1和L4
L1,L4和L5,L6
L2和L1,L4,L5,L6
L5和L6
L3和L2,L1,L4,L5,L6

【问题讨论】:

  • 这里要遵循的规则是什么?你在脑海中应用什么算法来得出预期的结果。
  • 首先使用System.Collections.IComparer 接口编写一个比较例程(还有其他方法,但在这里保持简单明了),它只根据您的要求比较其中两个字符串。返回值应该是一个整数,表示字符串#1是否小于字符串#2(结果-1),字符串#1大于字符串#2(结果1),或者字符串#1是否相同作为字符串#2(结果0)。
  • 不需要手动编写完整的排序例程,因为有了这样一个基于IComparer的自定义比较器,几个函数/集合可以根据您的需要进行排序。此外,单独的比较例程比嵌套循环中的一堆代码更容易测试/故障排除/调试。 ;-)
  • 更正:我在第一条评论中的意思不是System.Collections.IComparer,而是System.Collections.Generic.IComparer&lt;string&gt;。抱歉打嗝...

标签: c# list split swap


【解决方案1】:

假设 1:您希望先按“L”的数量排序,然后按“L”后面的数字排序。

给出的代码中的主要问题是您从不检查数组的长度,因此 L1,L4 将始终排在 L5 之前,因为 L1 排在 L5 之前。

如果您将 'and' 与 ',' 分开,并首先对从 ',' 拆分的数组的长度进行排序,然后再对该数组的内容进行排序,那么它应该与您建议的排序顺序相匹配。

【讨论】:

    【解决方案2】:

    使用字典怎么样?

        public static Dictionary<string, int> YourDictionary()
        {
            Dictionary<string, int> returnDict = new Dictionary<string, int>();
    
            returnDict.Add("L1andL4", 1);
            returnDict.Add("L5andL6", 2);
            returnDict.Add("L1,L4andL5,L6", 3);
            returnDict.Add("L2andL1,L4,L5,L6", 4);
            returnDict.Add("L3andL2,L1,L4,L5,L6", 5);
    
            return returnDict;
        }
    

    然后遍历字典:

            var theDictionary = clsProdDesign.YourDictionary();
            var items = from pair in theDictionary orderby pair.Value ascending select pair;
    
            foreach (KeyValuePair<string, int> pair in items)
            {
                //do whatever
            }
    

    【讨论】:

    • 现在我想了更多关于你想要做什么的事情,我可能只是在 SQL 中构建一个表来完成这项任务。有一列供您选择、分组和排序顺序。
    猜你喜欢
    • 2013-03-23
    • 1970-01-01
    • 2013-05-06
    • 2011-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-17
    相关资源
    最近更新 更多