【发布时间】: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<string>。抱歉打嗝...