我需要按照2条规则对List<string>
进行排序。
我的string
元素将始终设置为XXXnnnnE
或XXXnnnnD
格式,其中X
是从A到Z的大写字母,而n
是从0到0的数字。 9。
我想按字母顺序对列表进行排序,但是我希望E
字符串位于D
字符串之前,如下所示
DFG0001D
AWK0007E
ORK0127E
AWK0007D
DFG0001E
ORK0127D
需要排序为
AWK0007E
AWK0007D
DFG0001E
DFG0001D
ORK0127E
ORK0127D
我怎么能做到这一点?
感谢帮助
答案 0 :(得分:5)
以下是如何使用Linq OrderBy和ThenByDescending操作来完成此操作的代码段:
string[] arr = { "DFG0001D", "AWK0007E", "ORK0127E", "AWK0007D", "DFG0001E", "ORK0127D" };
arr = arr
.OrderBy(r => r.Substring(0, 7))
.ThenByDescending(s => s.Substring(7, 1))
.ToArray();
答案 1 :(得分:1)
您可以使用自定义委托并比较第一个3个字符和最后一个3个字符:
select * from
(select bt.*, sm.newparam from
select * from big_table bt where ident is not null or cate is not null
left outer join
small_table st
on bt.ident = sm.ident
and bt.cate - sm.cate
union all
select *, null as newparam from big_table nbt where ident is null and cate is null) combined
答案 2 :(得分:0)
像这样实现您自己的比较器:
class CustomStringComparer : IComparer<string>
{
private readonly IComparer<string> _baseComparer;
public CustomStringComparer(IComparer<string> baseComparer)
{
_baseComparer = baseComparer;
}
public int Compare(string x, string y)
{
// strings are completely same
if (_baseComparer.Compare(x, y) == 0)
{
return 0;
}
// strings are completely same except last char
if (_baseComparer.Compare(x.Substring(0, x.Length - 2), y.Substring(0, y.Length - 2)) == 0)
{
// if last char is E then win
return x.Last() == 'E' ? -1 : 1;
}
// defaut compare everything else
return _baseComparer.Compare(x, y);
}
}
那么您就可以这样做:
static void Main(string[] args)
{
List<string> list = new List<string>()
{
"DFG0001D",
"AWK0007E",
"ORK0127E",
"AWK0007D",
"DFG0001E",
"ORK0127D"
};
list.Sort(new CustomStringComparer(StringComparer.CurrentCulture));
foreach (var item in list)
{
Console.WriteLine(item);
}
}
输出为:
AWK0007E
AWK0007D
DFG0001E
DFG0001D
ORK0127E
ORK0127D
答案 3 :(得分:0)
var list = new List<string>{
"DFG0001D",
"AWK0007E",
"ORK0127E",
"AWK0007D",
"DFG0001E",
"ORK0127D"
};
list.Sort((str1, str2) => {
var eq = string.Compare(str1.Substring(0, str1.Length - 1), str2.Substring(0, str2.Length - 1));
if (eq == 0)
eq = string.Compare(str2[str2.Length - 1].ToString(), "E");
return eq;
});
foreach (var str in list)
Console.WriteLine(str);
输出:
AWK0007E
AWK0007D
DFG0001E
DFG0001D
ORK0127E
ORK0127D