IReliableDictionary无Select定义,如何将其转换为IList/IEnumerable?
解决IReliableDictionary无法调用Select方法的问题
错误原因
IReliableDictionary<int, ContactDetail> 并未实现 IEnumerable<T> 接口,所以LINQ的Select这类扩展方法没法直接用在它上面。
解决方案
要遍历IReliableDictionary里的元素,得先通过它的CreateEnumerableAsync方法拿到异步可枚举对象,再通过异步LINQ或者手动遍历转成列表。
方法1:用异步LINQ(需要安装System.Linq.Async NuGet包)
ReliableDictionary<int, ContactDetail> contactDetails = await _stateManager.GetOrAddAsync<IReliableDictionary<int, ContactDetail>>("contacts"); // 获取异步枚举并转换为列表 var contactDetailsList = await contactDetails.CreateEnumerableAsync() .Select(kv => kv.Value) .ToListAsync();
方法2:手动异步遍历
不想加额外包的话,就手动遍历异步枚举:
ReliableDictionary<int, ContactDetail> contactDetails = await _stateManager.GetOrAddAsync<IReliableDictionary<int, ContactDetail>>("contacts"); var contactDetailsList = new List<ContactDetail>(); using (var enumerator = contactDetails.CreateEnumerableAsync().GetAsyncEnumerator()) { while (await enumerator.MoveNextAsync()) { contactDetailsList.Add(enumerator.Current.Value); } }
补充:CreateEnumerableAsync可以传入事务参数(如果需要在事务中操作数据),默认是无事务读取。
内容的提问来源于stack exchange,提问作者Nadeem Shaikh
相关产品推荐
相关产品推荐

