【问题标题】:Replace occurances of Enum values in a string with the index of the Enum value for String comparison将字符串中出现的 Enum 值替换为 Enum 值的索引以进行字符串比较
【发布时间】:2021-09-04 13:05:57
【问题描述】:

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

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);
        }

【问题讨论】:

  • 你看过string.Replace()enum.ToString()string.Contains()吗???
  • 我尝试过但无法正常工作,因此请求帮助。请参阅上面的更新。谢谢
  • 再看; Replace() 返回一个新字符串,它不会修改调用字符串。
  • 我觉得自己很笨。谢谢

标签: c# string enums compare


【解决方案1】:

你可以做的事情:

  • 以字符串形式获取枚举器的成员名称列表

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

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

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

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

使用当评估的位置增加时值减小的任何其他表达式。这个在每个单个字符串中限制为 ~350 个位置;之后,Math.Exp() 返回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

【讨论】:

    猜你喜欢
    • 2017-03-04
    • 1970-01-01
    • 1970-01-01
    • 2012-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    相关资源
    最近更新 更多