将字符串中出现的枚举值替换为用于字符串比较的枚举值的索引

Replace occurances of Enum values in a string with the index of the Enum value for String comparison

我有一个枚举,其中的项目是有意义地排序的:

enum MyEnum
{
   LORRY,
   BIKE,
   AMBULANCE,
   CAR
};

然后我有一些字符串,例如:

"1 CAR AND A LORRY"
"1 LORRY AND A BIKE"
"1 AMBULANCE AND A BIKE"
"1 LORRY AND A AMBULANCE"

按字母顺序对这些字符串进行排序会得到:

"1 AMBULANCE AND A BIKE"
"1 CAR AND A LORRY"
"1 LORRY AND A AMBULANCE"
"1 LORRY AND A BIKE"

但我希望根据枚举的顺序对字符串进行排序。所以我的结果应该是:

"1 LORRY AND A BIKE"
"1 LORRY AND A AMBULANCE"
"1 AMBULANCE AND A BIKE"
"1 CAR AND A LORRY"

我想我可以用枚举索引替换字符串中枚举值的每次出现,并使用 string.Compare() 中的新字符串来实现正确的排序。问题是,如何用索引替换字符串以实现:

"1 0 AND A 1"
"1 0 AND A 2"
"1 2 AND A 1"
"1 3 AND A 0"

    public int Compare(object x, object y)
        {
            TreeNode tx = x as TreeNode;
            TreeNode ty = y as TreeNode;
    
            string s1 = tx.Text;
            string s2 = tx.Text;
            
            // What Goes here to replace the enum values in the strings with the enum index?
    
            // I tried this but the replace seems not to work
            MyEnum[] myEnums= Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>().ToArray();
            for (int i = positions.Length - 1; i >= 0; i--)
            {
                MyEnum myEnum = myEnums[i];
                string str = myEnum.ToString();
                string index = ((int)myEnum).ToString();

                s1.Replace(str, index);
                s2.Replace(str, index);
            }
            return string.Compare(s1, s2);
        }

你可以做的事情:

  • 获取枚举器的成员名称列表作为字符串

  • 根据名称列表内容确定的值对字符串数组进行排序

  • 只考虑匹配枚举器成员的单词

  • 根据单词在字符串中的位置为单词提供更多 :当在第一个位置找到单词时,单词具有 最大值值value 在第一个之后的每个位置逐渐减小。公式就是:

    double value += [position] * (int.MaxValue / Math.Exp([Index] * 2))  
    

使用在评估的位置增加时值减少的任何其他表达式。这个在每个字符串中有大约 350 个位置的限制;在那之后,Math.Exp() returns 0.

这种形式有明显的局限性,不包含与枚举器成员姓名匹配的单词的字符串首先列出,但不以任何方式排序。 这不是问题的一部分。根据需要修改。

string[] phrases = new[] {
    "1 LORRY AND A BIKE",
    "1 AMBULANCE AND AN BIKE FOLLOW BY A LORRY",
    "1 LORRY AND AN AMBULANCE",
    "1 CAR AND A BIKE",
    "1 AMBULANCE AND A BIKE",
    "1 LORRY AND A LORRY",
    "1 NO CARS OR BIKES",
    "1 AMBULANCE AND A BLUE CAR AND A RED CAR AND A WHITE CAR",
    "1 CAR AND ANOTHER FANCY LORRY"
};

var enumNames = Enum.GetNames(typeof(StringyEnum)).ToList();

var ordered = phrases.OrderBy(sv => sv.Split().Where(enumNames.Contains)
    .Select((s, i) => (s, i)).Sum(n =>
        (enumNames.IndexOf(n.s) + 1) * (int.MaxValue / Math.Exp(n.i*2))
    ));

这将字符串排序为:

1 NO CARS OR BIKES
1 LORRY AND A LORRY
1 LORRY AND A BIKE
1 LORRY AND AN AMBULANCE
1 AMBULANCE AND A BIKE
1 AMBULANCE AND AN BIKE FOLLOW BY A LORRY
1 AMBULANCE AND A BLUE CAR AND A RED CAR AND A WHITE CAR
1 CAR AND ANOTHER FANCY LORRY
1 CAR AND A BIKE