2014-09-17 2 views
15

Я пытаюсь взять Select и проецировать каждые элементы в Dictionary<string, UdpReceiveResult> Я в настоящее время Select что только проецирует ценность Dictionary к списку tasks типа UdpReceiveResult. clients - это словарь типа Dictionary<string, UdpClient>. У меня естьLINQ Выберите в словарь

var tasks = clients.Select(c => c.Value.ReceiveAsync()).OrderByCompletion(); 

Я хочу, чтобы спроецировать ключ и ReceiveAsync() результат в новый Dictionary. OrderByCompletion - от Nito.AsyncEx dll.

+1

.ToDictionary (х => х. [Ключ], х => х. [Значение]) является функцией LINQ это не правильно, или вы нуждаясь в лямбда-выражение асинхронной? – dbarnes

+0

.ToDictionary (x => x. [Key], x => x. [Value]) позволяет вам заполнять значения из типа Task . Ключ от клиентов, который является словарем типа string, UdpClient – Jesse

+0

Это необязательный оператор select. Мне действительно нужен способ запустить ReceiveAsync()). OrderByCompletion() для каждого UdpClient и проект в словарь . – Jesse

ответ

30

Ну, для начала, вам нужно свой результат также включать ключ:

var tasks = clients.Select(async c => new 
{ 
    c.Key, 
    Value = await c.Value.ReceiveAsync(), 
}); 

Затем, когда задачи завершения вы можете поместить их в словаре:

var results = await Task.WhenAll(tasks); 
var dictionary = results.ToDictionary(
    pair => pair.Key, pair => pair.Value); 
14

Этот код выполнит то же самое в одной строке кода.

var tasks = clients.ToDictionary(c => c.Key, c => c.Value.ReceiveAsync()); 
Смежные вопросы