Словарь int
s, который я изначально сгенерировал случайным образом в диапазоне от 1 до 100, используя:
var lstNumbers = Enumerable.Range(1, 100).OrderBy(n => Guid.NewGuid)
.GetHashCode()).ToList();
Словарь создается и используется для присвоения ColorType
значений каждому из чисел в последовательности Red, Yellow, White, Red, Yellow, White и т. д. и т. д. всем числам в списке:
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();
Я предполагаю, что есть лучший способ сделать это, по-другому, или я что-то упускаю полностью.
colors.OrderBy(c => c.Value != ColorType.White).ThenBy(c => c.Value != ColorType.Yellow).ThenBy(c => c.Value != ColorType.Red)
- person   schedule 08.04.2018static IEnumerable<double> PseudorandomNumbers() { Random r = new Random(); while(true) yield return r.NextDouble(); }
, и теперь вы можете сказатьEnumerable.Range(1,100).Zip(PseudorandomNumbers(), (i, d) => new { i, d }).OrderBy(p=>p.d).Select(p=>p.i).ToList()
, и все готово. Если вам нужна случайность криптостойкости, сделайте то же самое, но с бесконечной последовательностью чисел криптостойкости. - person Eric Lippert   schedule 09.04.2018