有没有一种方法可以通过在c#中结束子字符串来对字符串列表进行排序?

时间:2019-09-29 03:53:46

标签: c# .net

我有一个字符串列表,需要在其中按结尾子字符串对其进行排序。例如,假设我们在列表中有以下字符串:

  

Get_USER_By_ID

     

Get_Product_By_Name

     

Get_Product_By_ID

     

Get_Location_By_Name

     

...

我需要对它进行排序,以使与同一By_匹配的所有功能都互相追对

我可以遍历该列表,并创建许多新列表,并且如果该字符串包含特定字符串(即By_ID),则将其添加到与其相关的列表中。

我想将它们排序在同一列表中(就像我说的是升序还是降序),而不是创建许多新列表(以我为例,我必须创建9个新列表)

2 个答案:

答案 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();