如何在C#.net中按降序对包含字母和数字的字符串列表进行排序?

问题描述

我在字符串列表中有值,例如

AB1001_A
AB1001_B
AB1002_2
AB1002_C
AB1003_0
AB1003_
AB1003_B
AB1003_A
AB1001_0
AB1001_1
AB1001_2
AB1001_C
AB1002_B
AB1002_A

我想按升序排列,后缀按降序排列,如下所示

AB1001_2
AB1001_1
AB1001_0
AB1001_C
AB1001_B
AB1001_A
AB1002_0
AB1002_B
AB1002_A
AB1003_0
AB1003_B
AB1003_A
AB1003_

如何在C#.net中对其进行编码?

解决方法

这是一个很奇怪的排序,但是如果您真的需要它,请尝试如下操作:

List<string> lItemsOfYourValues = new List<string>() {"AB1001_A","AB1001_B","AB1001_0" /*and next your values*/};

List<Tuple<string,string,string>> lItemsOfYourProcessedValues = new List<Tuple<string,string>>();
string[] arrSplitedValue;

for(int i = 0; i < lItemsOfYourValues.Count; i++) 
{

arrSplitedValue = lItemsOfYourValues[i].Split("_");

lItemsOfYourProcessedValues.add(new Tuple<string,string>(lItemsOfYourValues[i],arrSplitedValue[0],arrSplitedValue[1]));

}

List<string> lSortedValues = lItemsOfYourProcessedValues.OrderBy(o => o.Item2).ThenByDescending(o => o.Item3).Select(o => o.Item1).ToList();
,

由于输入中有 <v-list-item @click="drawer = !drawer"> <v-icon>mdi-chevron-right</v-icon> </v-list-item> <v-list-item @click="show = !show"> show1 </v-list-item> <v-list-item @click="show2 = !show2"> show2 </v-list-item> <div v-if="show == true"> <v-row no-gutters> <v-col v-for="card in cards" :key="card"> <v-card dark tile height="200" width="98%" style="display: inline-flex" class="ma-2" > <v-card-title> {{ card.name }} </v-card-title> </v-card> </v-col> </v-row> </div> <div v-if="show2 == true"> <v-row no-gutters> <v-col> <v-card dark tile width="98%" style="display: inline-flex" class="ma-2" > </v-col> </v-row> </div>而不是预期结果,因此您的预期结果似乎有误。

假设这只是一个错误,并进一步假设后缀仅限于单个字符或数字,则可以通过编写特殊的比较器来解决排序问题,如下所示:

AB1002_2

然后您可以使用它来对字符串列表,数组或static int compare(string x,string y) { var xParts = x.Split('_',StringSplitOptions.RemoveEmptyEntries); var yParts = y.Split('_',StringSplitOptions.RemoveEmptyEntries); if (xParts.Length != yParts.Length) return yParts.Length - xParts.Length; // No suffix goes after suffix. if (xParts.Length == 0) // Should never happen. return 0; int comp = string.Compare(xParts[0],yParts[0],StringComparison.Ordinal); if (comp != 0 || xParts.Length == 1) return comp; if (char.IsDigit(xParts[1][0]) && !char.IsDigit(yParts[1][0])) return -1; // Digits go before non-digit. if (!char.IsDigit(xParts[1][0]) && char.IsDigit(yParts[1][0])) return 1; // Digits go before non-digit. return string.Compare(yParts[1],xParts[1],StringComparison.Ordinal); } 进行排序,如下所示:

IEnumerable<string>

Try it online on .Net Fiddle

,

最后我得到了这个东西

var mystrings = new []
            {
                "AB1001_A","AB1002_2","AB1002_C","AB1003_0","AB1003_","AB1003_B","AB1003_A","AB1001_0","AB1001_1","AB1001_2","AB1001_C","AB1002_B","AB1002_A",};


mystrings.Cast<string>().OrderBy(x => PadNumbers(x));

然后PadNumbers的功能如下

        public static string PadNumbers(string input)
        {
            return Regex.Replace(input,"[0-9]+",match => match.Value.PadLeft(10,'0'));
        }