假設我們有一個來源的IEnumerable序列:調試時檢查IEnumerable「堆棧」?
IEnumerable<Tuple<int, int>> source = new [] {
new Tuple<int, int>(1, 2),
new Tuple<int, int>(2, 3),
new Tuple<int, int>(3, 2),
new Tuple<int, int>(5, 2),
new Tuple<int, int>(2, 0),
};
我們要應用一些過濾器和一些轉換:
IEnumerable<int> result1 = source.Where(t => (t.Item1 + t.Item2) % 2 == 0)
.Select(t => t.Item2)
.Select(i => 1/i);
IEnumerable<int> result2 = from t in source
where (t.Item1 + t.Item2) % 2 == 0
let i = t.Item2
select 1/i;
這兩個查詢是等效的,都將在最後一個項目拋出DivideByZeroException
。
但是,當枚舉第二個查詢時,VS調試器將讓我檢查整個查詢,因此非常方便地確定問題的根源。
然而,當第一個查詢列舉沒有相應的幫助。檢查到LINQ執行國債收益率沒有有用的數據,可能是由於二進制進行優化:
有沒有辦法來有效地檢查枚舉值了的IEnumerable
的「棧」時不使用查詢語法?查詢語法不是一種選擇,因爲共享代碼是不可能的(即,轉換不是微不足道的,並且不止一次使用)。
是的,但是如果序列很大,那麼我們會得到很多不相關的命中。我們不能(總是)在斷點上設置適當的條件,因爲我們還不知道問題是什麼!問題是「我怎麼變成了零?」,並且在Where子句中確定相應的中斷條件並不總是微不足道的。 – felipe
@felipe請參閱編輯。 – Servy
標記爲答案,似乎沒有創建中間類型的替代方法。謝謝! – felipe