将字符串中出现的枚举值替换为用于字符串比较的枚举值的索引
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
我有一个枚举,其中的项目是有意义地排序的:
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