我最初在1-100范围内使用以下命令随机生成了字典int

var lstNumbers = Enumerable.Range(1, 100).OrderBy(n => Guid.NewGuid)
                           .GetHashCode()).ToList();


创建字典并使用它为列表中的所有数字按红色,黄色,白色,红色,黄色,白色等顺序为每个数字分配ColorType值:

var startColor = ColorType.Red;
var map = new Dictionary<int, ColorType>();
foreach(var number in lstNumbers) {
  // First color for assignment
  map[number] = startColor.Next();
  // Go to the next color
  startColor = startColor.Next();
}


然后,我以几种不同的方式删除项目:

foreach(KeyValuePair<int, ColorType> entry in map.ToList()) {
  if (entry.Key % 2 == 0 && entry.Value == ColorType.Red) {
    map.Remove(entry.Key);
  }
  if (entry.Key % 2 == 1 && entry.Value == ColorType.Yellow) {
    map.Remove(entry.Key);
  }
  if (entry.Key % 3 == 0 && entry.Value == ColorType.White) {
    map.Remove(entry.Key);
  }
}


然后,我按升序对数字进行排序:

foreach(var number in map.OrderBy(i => i.Key)) {
  Console.WriteLine(number);
}

Console.ReadLine();


所以我的清单现在看起来像这样:

[53, Red]
[54, Yellow]
[55, White]
[56, Yellow]
[61, White]
[62, White]
[64, Yellow]
[65, Red]
ect., ect.


现在,我需要按值对字典的最终列表进行排序,其中白色结果在顶部,黄色在中间,红色在底部。红色
我尝试了这个OrderBy,但是我可能没有正确实现它,或者由于我遇到错误,它可能不适用于我的情况:


  ==运算符不能应用于'ColorType'和'string'的操作数。


foreach(var color in map.OrderBy(c => c.Value == "White" ? 0 : c.Value == "Yellow" ? 1 : 2)) {
  Console.WriteLine(color);
}


我尝试使用IComparer,但是遇到了问题,因为我在字典中使用了用于颜色的自定义类型:

public class CustomerComparer : IComparer<KeyValuePair<int, ColorType>> {
  private List<string> orderedColors = new List<string>() { "White", "Yellow", "Red" };

  public int Compare(KeyValuePair<int, ColorType> str1, KeyValuePair<int, ColorType> str2) {
    return orderedColors.IndexOf(str1.Value) - orderedColors.IndexOf(str2.Value);
  }
}

var sorted = map.OrderBy(x => x, new CustomerComparer());

foreach(var entry in sorted) {
  Console.WriteLine("{0}: {1}", entry.Key, entry.Value);
}
Console.ReadKey();


我猜想有一种更好的方法可以做到这一点,否则我会完全丢失一些东西。

最佳答案

正如您得到的错误所示,您试图将ColorTypeString进行比较。您需要使两个侧面都相同,都ColorType

foreach (var color in map.OrderBy(c => c.Value == ColorType.White ?
                                       0 : c.Value == ColorType.Yellow ? 1 : 2)) {
    Console.WriteLine(color);
}


或两者都String。您说ColorType是自定义数据类型,所以我不知道ToString()是否会返回颜色的名称:

foreach (var color in map.OrderBy(c => c.Value.ToString() == "White" ?
                                       0 : c.Value.ToString() == "Yellow" ? 1 : 2)) {
    Console.WriteLine(color);
}


例如,如果使用System.Drawing.Color类,则ToString()将不起作用,因为它返回的内容类似于Color [Red]。相反,您可以使用Name属性:

foreach (var color in map.OrderBy(c => c.Value.Name == "White" ?
                                       0 : c.Value.Name == "Yellow" ? 1 : 2)) {
    Console.WriteLine(color);
}


因此,我不知道您的ColorType类是否具有返回颜色名称的类似属性,或者ToString()是否可以完成工作。

07-24 17:17