C# 在列表中的单元格内按单元格中的每个字符进行排序
我正在开发一个应用程序,其中有一个我自己定义的类型的C#列表,它有大约7列和几行数据。特别是我有一个字符串类型的列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
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);