问题描述
我在字符串列表中有值,例如
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>
,
最后我得到了这个东西
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'));
}