我有一个源元素Foo
的列表,还有一个异步方法GetBoosAsync()
将它们转换为类型Boo
的元素:
public class Foo
{
public string Value { get; set; }
}
public class Boo
{
public string Value { get; set; }
}
static void Main(string[] args)
{
IReadOnlyCollection<Foo> foos = GetFoos();
Task<IReadOnlyCollection<Boo>> boosTask = GetBoosAsync(foos);
boosTask.Wait();
foreach (Boo boo in boosTask.Result)
{
Console.WriteLine(boo.Value);
}
Console.ReadKey();
}
public static IReadOnlyCollection<Foo> GetFoos()
{
return Enumerable.Range(1, 100).Select(i => new Foo
{
Value = i.ToString(CultureInfo.CurrentCulture)
}).ToList();
}
public static async Task<IReadOnlyCollection<Boo>> GetBoosAsync(IReadOnlyCollection<Foo> foos)
{
List<Task<Boo>> booTasks = foos.Select(ConvertFooToBooAsync).ToList();
// Waiting for ALL conversions of Foos to Boos
await Task.WhenAll(booTasks.ToArray<Task>());
return booTasks.Select(booTask => booTask.Result).ToList();
}
public static Task<Boo> ConvertFooToBooAsync(Foo foo)
{
return Task.Factory.StartNew(() =>
{
Thread.Sleep(100);
return new Boo { Value = foo.Value };
});
}
方法GetBoosAsync()
为每个元素调用ConvertFoosToBoosAsync
,等待所有转换完成,然后返回结果列表。
问题:
如何实现方法GetBoosAsync
代替返回IObservable<Boo>
,并在处理单个元素时异步返回它们?
即
public static IObservable<Boo> OGetBoos(IReadOnlyCollection<Foo> foos)
{
...
}
并像这样使用它:
static void Main(string[] args)
{
IReadOnlyCollection<Foo> foos = GetFoos();
IObservable<Boo> boos = OGetBoos(foos);
boos = boos.Do(boo =>
{
Console.WriteLine(boo.Value);
});
boos.Wait();
Console.ReadKey();
}
参考方案
这对您有用吗?
public static IObservable<Boo> OGetBoos(IReadOnlyCollection<Foo> foos)
{
var query =
from f in foos.ToObservable()
from b in ConvertFooToBooAsync(f).ToObservable()
select b;
return query;
}
顺便说一句,感谢您在问题中易于编译的工作代码!
将谓词<T>转换为Func <T,bool> - c#我有一个包含成员Predicate的类,希望在Linq表达式中使用该类:using System.Linq; class MyClass { public bool DoAllHaveSomeProperty() { return m_instrumentList.All(m_filterExpression); } private IEnumerable&…
根据激活的Maven配置文件更新战争名称 - java在pom中,我有两个配置文件。测试1测试2现在,我希望根据激活的配置文件更改战争名称。预期结果激活test1配置文件后,战争名称应为prefix-test1.war。激活test1和test2时,战争名称应为prefix-test1-test2.war。如果没有激活任何配置文件,则战争名称应为prefix.war。我的POM文件....<?xml ve…
将对象转换为List <object> - c#我看过类似的问题,但没有什么合适的。我有一个碰巧包含列表的对象。我想把它变成我可以列举的东西。例如:object listObject; // contains a List<Something> List<object> list; list = listObject as List<object>; // list c…
合并List <T>和List <Optional <T >> - java鉴于: List<Integer> integers = new ArrayList<>(Arrays.asList( 10, 12 )); List<Optional<Integer>> optionalIntegers = Arrays.asList( Optional.of(5), Optional.em…
OpenShift构建错误:无法在多模块Maven Spring启动项目的父模块中导入子模块类 - java我有一个使用spring的多模块Maven项目。通用模块类用作业务模块项目中的直接导入。我可以在本地PC上编译并成功运行它们。当我在OpenShift中部署相同的模块时,出现错误,无法在业务模块中导入通用模块类。项目结构可以总结如下:项目根 通用模块 src pom.xml 业务模块 src pom.xml pom.xml父POM:<?xml vers…