我查看了 List.ForEach(Action action) 方法的檔案,但它只說明了它的作用,而不是它是如何做到的。我知道它采取行動并對串列的所有元素執行該行動。但是它用來完成這個的實際代碼是什么?有沒有辦法讓我自己的 ForEach 方法與串列 ForEach 方法的作業方式相同?
過去我曾有幾次想要壓縮我的 ForEach 回圈,這看起來在某些情況下會很好地作業,尤其是當我使用自定義類時。
uj5u.com熱心網友回復:
我將從 c# 源代碼中提取 if,該源代碼在線發布在 MS 的專用站點和GitHub 上- 用于書簽的有用資源:
public void ForEach(Action<T> action) {
if( action == null) {
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.match);
}
Contract.EndContractBlock();
int version = _version;
for(int i = 0 ; i < _size; i ) {
if (version != _version && BinaryCompatibility.TargetsAtLeast_Desktop_V4_5) {
break;
}
action(_items[i]);
}
if (version != _version && BinaryCompatibility.TargetsAtLeast_Desktop_V4_5)
ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_EnumFailedVersion);
}
大多數情況下它只是用于版本檢查和拋出的絨毛,核心部分是一個 for 回圈,它采用您提供的方法并呼叫它依次傳入每個串列項:
public void ForEach(Action<T> action) {
for(int i = 0 ; i < _size; i ) {
action(_items[i]);
}
}
你絕對可以在你自己的類中自己撰寫它,它看起來就像那樣。這是 .NET 框架版本 - 核心版本不會有很大不同
請注意,這不是一個巨大的字符節省:
foreach(var v in vList) myMethod(v);
vList.ForEach(myMethod);
foreach(var v in vList)
if(v.X > 10)
Console.WriteLine(v.Y);
vList.ForEach(v => {
if(v.X > 10)
Console.WriteLine(v.Y);
});
隨著 foreach 變長,大多數情況下 foreach 仍然具有相當的可讀性,而當您開始使用多行 lambda 時,它們最終會看起來更凌亂,并且不會明顯更簡潔
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/322309.html
上一篇:拆分串列中的值并創建2個新串列
