下面的代码段来自c#和xaml中的Windows 8商店应用。 我已经将这些代码放在网上的各种样本中,所以这可能不是最好的方法。其中大部分来自VS2012中提供的Grid模板,我将我的web api作为数据源连接起来
请解释以下
当我调用Get方法时,一切正常,我将数据恢复到xaml视图中 当我以相同的方法取消注释Take(10)时,我没有得到任何数据。
似乎任何尝试放置LINQ变种的扩展方法只会停止返回的数据,也没有说明原因,它符合要求!
任何帮助表示赞赏
由于 标记
public class TeamDataSource
{
private static TeamDataSource _sampleDataSource = new TeamDataSource();
private ObservableCollection<TeamDataItem> _items = new ObservableCollection<TeamDataItem>();
public ObservableCollection<TeamDataItem> Items
{
get { return this._items; }
}
public TeamDataSource()
{
this.Initialize();
}
public static IEnumerable<TeamDataItem> Get()
{
var thisdata = _sampleDataSource.Items;
return thisdata;//.Take(10);
}
private async void Initialize()
{
using (var client = new DataServiceClient())
{
List<TeamDataItem> list = await client.Download<List<TeamDataItem>>("/teams");
foreach (var i in list.OrderByDescending(t => t.Points).ThenByDescending(t => t.GoalDiff))
{
TeamDataItem team = i;
_items.Add(team);
}
}
}
}
答案 0 :(得分:0)
您的问题是Take
没有立即枚举这些项目。它推迟枚举,直到在其上调用foreach
或在其上调用GetEnumerator
。在这种情况下,它枚举的集合被处理(一旦Get
内容结束),所以当它最终枚举项目时,就不再有项目了。尝试在返回语句之前添加thisdata.GetEnumerator();
作为一行。
来自here:
此方法通过使用延迟执行来实现。眼前的 返回值是存储所有信息的对象 需要执行操作。此方法表示的查询 在通过调用对象枚举对象之前不会执行 直接使用GetEnumerator方法或在Visual C#或For中使用foreach 每个都在Visual Basic中。
答案 1 :(得分:0)
最终看起来很明显。当我使用aync和await时,调用在数据到达之前立即返回。因此Take(4)没有任何工作。
现在唯一的问题是我什么时候可以告诉任务已经完成?