Я смог выполнить это, создав собственный метод расширения.
static class Extensions {
internal static IEnumerable<Tuple<int, int, int>> GroupAdj(this IEnumerable<Cls> enumerable) {
Cls start = null;
Cls end = null;
int value = Int32.MinValue;
foreach (Cls cls in enumerable) {
if (start == null) {
start = cls;
end = cls;
continue;
}
if (start.Value == cls.Value) {
end = cls;
continue;
}
yield return Tuple.Create(start.SequenceNumber, end.SequenceNumber, start.Value);
start = cls;
end = cls;
}
yield return Tuple.Create(start.SequenceNumber, end.SequenceNumber, start.Value);
}
}
Вот реализация:
static void Main() {
List<Cls> items = new List<Cls> {
new Cls { SequenceNumber = 1, Value = 9 },
new Cls { SequenceNumber = 2, Value = 9 },
new Cls { SequenceNumber = 3, Value = 15 },
new Cls { SequenceNumber = 4, Value = 15 },
new Cls { SequenceNumber = 5, Value = 15 },
new Cls { SequenceNumber = 6, Value = 30 },
new Cls { SequenceNumber = 7, Value = 9 }
};
Console.WriteLine("From To Value");
Console.WriteLine("===== ===== =====");
foreach (var item in items.OrderBy(i => i.SequenceNumber).GroupAdj()) {
Console.WriteLine("{0,-5} {1,-5} {2,-5}", item.Item1, item.Item2, item.Item3);
}
}
И ожидаемый вывод:
From To Value
===== ===== =====
1 2 9
3 5 15
6 6 30
7 7 9
После подписки соединение (TCP?) остается открытым все время для поддержки последующих обратных вызовов? Я имею в виду, что обратные вызовы используют то же соединение, которое было инициировано потребителем при подписке?
blockquote>Да. Вы можете наблюдать это, используя множество различных средств - сетевые инструменты, такие как
netstat
,ss
, Wireshark, или используя инструменты RabbitMQ, такие как веб-интерфейс управления или командаrabbitmqctl
. Наконец, все соединения / разъединения регистрируются.
ПРИМЕЧАНИЕ: команда RabbitMQ отслеживает список рассылки
rabbitmq-users
и только иногда отвечает на вопросы о StackOverflow.