在列表中的单元格内排序,具体由单元格中的每个字符排序

时间:2014-09-18 13:45:01

标签: 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
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

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

2 个答案:

答案 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