我有一个字符串列表,需要在其中按结尾子字符串对其进行排序。例如,假设我们在列表中有以下字符串:
Get_USER_By_ID
Get_Product_By_Name
Get_Product_By_ID
Get_Location_By_Name
...
我需要对它进行排序,以使与同一By_匹配的所有功能都互相追对
我可以遍历该列表,并创建许多新列表,并且如果该字符串包含特定字符串(即By_ID),则将其添加到与其相关的列表中。
我想将它们排序在同一列表中(就像我说的是升序还是降序),而不是创建许多新列表(以我为例,我必须创建9个新列表)
答案 0 :(得分:4)
您可以创建Custom Comparer。 IComparer定义了如何比较类型T的对象。它可以与List.Sort一起使用,以对集合进行自定义排序。例如,对于输入集合
var strList = new List<string>
{
"Get_USER_By_ID",
"Get_Product_By_Name",
"Get_Product_By_ID",
"Get_Location_By_Name"
};
您可以排序
strList.Sort(new CustomStringComparer());
或使用Linq
var result = strList.OrderBy(x=>x,new CustomStringComparer());
其中CustomStringComparer定义为
public class CustomStringComparer : IComparer<string>
{
private Regex _regex = new Regex(@"By_(?<Tag>[\S]*)",RegexOptions.Compiled);
public int Compare(string first, string second)
{
var firstSubString = _regex.Match(first).Groups["Tag"].Value;
var secondSubString = _regex.Match(second).Groups["Tag"].Value;
return firstSubString.CompareTo(secondSubString);
}
}
输出
Get_USER_By_ID
Get_Product_By_ID
Get_Product_By_Name
Get_Location_By_Name
答案 1 :(得分:0)
myList = myList.OrderBy(str => str.Split(new[] {"By_"}, StringSplitOptions.None)
.Last()).ToList();