C# 在列表中的单元格内按单元格中的每个字符进行排序

C# 在列表中的单元格内按单元格中的每个字符进行排序,c#,list,sorting,C#,List,Sorting,我正在开发一个应用程序,其中有一个我自己定义的类型的C#列表,它有大约7列和几行数据。特别是我有一个字符串类型的列Term,它通常包含字母数字项 样本数据 Time Product Term Strike Strategy Premium Volume 8:52:00 LN F15-H15 350 PUT 0.106 100 8:33:29 LN V14 400 CALL 0.033 100

我正在开发一个应用程序,其中有一个我自己定义的类型的C#列表,它有大约7列和几行数据。特别是我有一个字符串类型的列
Term
,它通常包含字母数字项

样本数据

Time      Product Term    Strike  Strategy  Premium  Volume
8:52:00     LN  F15-H15     350     PUT     0.106   100
8:33:29     LN  V14         400     CALL    0.033   100
9:42:51     LN  X14-J14     425     CALL    0.059   100
10:14:14    LN  X15-V15     325     PUT     0.1325  25
12:11:23    LN  H15 vs X14  450     CS      0.229   1000
12:12:03    LN  H15 vs X14  450     CS      0.229   550
12:12:58    LN  J14 vs F14  450     CS      0.229   100
12:13:33    LN  H15 vs X14  450     CS      0.229   100
12:14:20    LN  X14 vs H15  450     CS     0.229    100
如上面的列表所示,我有一个名为Term的列,我正在尝试在每个单元格中执行排序,其中包含符号
“-”(连字符)
“vs”
在单元格中,如按数字和字母顺序排序,例如在术语列的第三行,我有
X14-J14
,但我希望它按字母顺序排序,并使其成为
J14-X14
,因为数字都相同,但如果数字不同,则应通过赋予数字更高的优先级来排序如
H15 vs X14
应按
X14 vs H15
排序,使较低的数字排在第一位,而不考虑字母表

结果数据将存储在一个列表中,看起来应该像

    Time      Product   Term       Strike  Strategy Premium  Volume
    8:52:00     LN  F15-H15         350     PUT     0.106   100
    8:33:29     LN  V14             400     CALL    0.033   100
    9:42:51     LN  J14-X14         425     CALL    0.059   100
    10:14:14    LN  V15-X15         325     PUT     0.1325  25
    12:11:23    LN  X14 vs H15      450     CS      0.229   1000
    12:12:03    LN  X14 vs H15      450     CS      0.229   550
    12:12:58    LN  F14 vs J14      450     CS      0.229   100
    12:13:33    LN  X14 vs H15      450     CS      0.229   100
    12:14:20    LN  X14 vs H15      450     CS      0.229   100

有什么好办法可以解决这个问题吗?

如果你可以使用LINQ,试试这个

var list=new[]{new{Term=“F15-H15”},new{Term=“V14”},new{Term=“X14-J14”},new{Term=“X15-V15”},new{Term=“H15 vs X14”},new{Term=“H15 vs X14”},new Term=“J14 vs F14”},new{Term=“H15 vs X14”},new Term=“X14 vs H15 vs X15”};
var sorted=list.Select(x=>x.Term.Split(new[]{-”,“vs”},StringSplitOptions.removeMptyEntries).OrderBy(s=>s.OrderBy(s=>s.Substring(1,2)).Aggregate((c,n)=>c+“-”+n));

注意:它不保留分隔符-,vs

没有很好的方法可以做到这一点。将会有很多字符串操作,其中有很多:

public string SortTerm(string term) {
    Match match = Regex.Match(term, @"([a-z]\d{2})(-| vs )([a-z]\d{2})", RegexOptions.IgnoreCase);

    if (match.Success) {
        string left = match.Groups[1].Value;
        string mid = match.Groups[2].Value;
        string right = match.Groups[3].Value;

        int a = int.Parse(left.Substring(1));
        int b = int.Parse(right.Substring(1));

        if (a > b || (a == b && left[0] > right[0]))
            return right + mid + left;
    }

    return term;
}
简而言之,如果
术语
字符串与您描述的模式不匹配,请将其原封不动地返回。否则,如果右侧小于左侧,则交换订单

这将考虑分隔符字符串的类型(“-”或“vs”)

用法 您可以通过多种方式在集合上使用它

如果将对象存储在
列表中

如果您有一个
IEnumerable


你确定你也在比较优先级更高的数字吗?是的。
if(a>b | | |……)
实现了这一点。如果a(左侧)较大,则交换。否则,如果a和b相等,则比较字母。上述代码是否会影响其运行时的性能,因为上述代码仅适用于一个字符串?如果必须对整个列表运行代码,是否需要循环?最简单的方法是使用上面在循环中定义的方法。我将提供一些例子。如果其中一个术语类似于J17-V17与J18-V18,该怎么办
values.ForEach(val => val.Term = SortTerm(val.Term));
foreach (var value in values)
    value.Term = SortTerm(value.Term);