異世界


2012年7月29日 星期日

匿名代理

以下顯示 LIST<T>.FindIndex 的使用方法,當代理函式除了原<T> 物件外又需引入參數將是一大麻煩。

第一個程式使用全域變數解決,但是該函式如果被重複呼叫就可能出現錯誤。

public int mDevID;
public int mMsgID;

/* 搜尋 AlarmList,並回傳第一個符合的 Index,否則為 -1 */
public int ExistLog(int devID, int msgID)
{
mDevID = devID;
mMsgID = msgID;

return AlarmList.FindIndex(ProductExistLog);
}

/* AlarmList 搜尋用代理程式 for ExistLog() */
private bool ProductExistLog(NmsLog e)
{
return (e.MsgID == this.mMsgID) && (e.DevID == this.mDevID);
}

 

以匿名代理函式解決:
public int ExistLog(int devID, int msgID)
{
return AlarmList.FindIndex(
delegate(NmsLog e)
{
return (e.MsgID == devID) && (e.DevID == msgID);
}
);
}

以 Lambda 語法 改寫 匿名代理: 以 e 做為參數 傳遞給 "=>" 符號後面的運算式

public int ExistLogEx(int devID, int msgID)
{
return AlarmList.FindIndex( e => (e.MsgID == devID) && (e.DevID == msgID) );
}

沒有留言:

張貼留言