4

长话短说。分析后,此命令占用 0.1% 的处理时间

var ChangesetList = TFSConnection.GetInstance().GetVersionControl().QueryHistory
    (Path, VersionSpec.Latest,0, RecursionType.Full, "", null, 
    VersionSpec.Latest, Int32.MaxValue,true, false);

这一个,65,7%。(有趣的是,里面所有的处理只消耗3%)

foreach (Changeset changeset in ChangesetList)

我需要几秒钟才能得到我的清单......发生了什么?为什么遍历列表这么慢?

有没有更快的方法来做到这一点?

编辑:另外,为什么我不能直接将其转换为List<Changeset>?

4

3 回答 3

10

调用VersionControlServer.QueryHistory返回一个IEnumerable,所以我假设它就像在 LINQ to Objects 中一样,并且一旦您遍历 IEnumerable (关键字:延迟执行),就会执行实际查询。

您不能将结果分配给 List,因为返回值是IEnumerable. 在结果上调用Cast<Changeset>()OfType<Changeset>()返回一个泛型IEnumerable<Changeset>.之后,您可以调用ToList()并获得一个List<Changeset>. ToList()迭代,IEnumerable<T>所以它就像 foreach 并且需要大部分时间。

我提到的方法是扩展方法,位于 System.Linq 命名空间中。

于 2011-03-01T13:56:30.030 回答
4

QueryHistory 延迟加载集合。也就是说,在您尝试迭代它之前,它实际上并没有执行您的查询。

于 2011-03-01T13:49:14.433 回答
1

布尔“包含更改”正在花费时间...如果您不包含更改而仅包含更改集的元数据,则查询非常快

所以查询应该是这样的:

var ChangesetList = TFSConnection.GetInstance().GetVersionControl().QueryHistory     (Path, VersionSpec.Latest,0, RecursionType.Full, "", null, VersionSpec.Latest, Int32.MaxValue,**false,** false); 
于 2012-08-02T09:49:51.447 回答