LINQ选择转换为字典

44

我正尝试使用 Select 将每个元素映射为一个 Dictionary<string, UdpReceiveResult>。目前我只有一个 Select,它将一个 Dictionary 的值映射为类型为 UdpReceiveResult 的列表 tasksclients 是一个类型为 Dictionary<string, UdpClient> 的字典。

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

我希望将关键字和 ReceiveAsync() 的结果投影到一个新的 Dictionary 中。而 OrderByCompletion 来自于 Nito.AsyncEx dll。


1
".ToDictionary(x=>x.[key], x=>x.[value])" 是一个 LINQ 函数,这不正确吗?或者您需要一个异步 Lambda 表达式吗? - dbarnes
.ToDictionary(x=>x.[key], x=>x.[value]) 只允许使用类型为 Task<UdpReceiveResult> 的值填充。键来自客户端,是一个类型为 string, UdpClient 的字典。 - Jesse
它不一定是一个选择语句。我只需要一种方法在每个UdpClient上运行ReceiveAsync()).OrderByCompletion()并投影到Dictionary<string, UdpReceiveResult>中。 - Jesse
2个回答

66
首先,你需要让你的结果也包含关键字:
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); 

51

这段代码可以用一行代码实现相同的功能。

var tasks = clients.ToDictionary(c => c.Key, c => c.Value.ReceiveAsync());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接