我正在开发一个应用程序,其中我有一个我自己定义的类型的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的列,我正在尝试在每个Cell中执行排序,在单元格中有符号"-" (hyphen)
和"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
有什么方法可以解决这个问题吗?
答案 0 :(得分:1)
这不是一个很好的方法。会有字符串操作,其中很多都是:
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;
}
简而言之,如果term
字符串与您描述的模式不匹配,请将其保持不变。否则,如果右侧小于左侧,则交换订单。
这将尊重分隔符字符串的类型(" - "或" vs")。
您可以通过多种方式在集合中使用此功能。
如果您的对象存储在List<T>
:
values.ForEach(val => val.Term = SortTerm(val.Term));
如果您有IEnumerable<T>
:
foreach (var value in values)
value.Term = SortTerm(value.Term);
答案 1 :(得分:0)
如果可以使用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"} };
var sorted = list.Select(x => x.Term.Split(new [] {"-", " vs "}, StringSplitOptions.RemoveEmptyEntries).OrderBy(s => s).OrderBy(s => s.Substring(1, 2)).Aggregate((c, n) => c + "-" + n));
注意:它不保留分隔符 - ,vs