[英]How do you pass multiple functions as constrainment parameters in C#?
對於我要學習的東西,這可能是一個措辭不佳的問題,因此我將解釋我要做什么。 我使用以下表達式創建以下列表:
var showIndexes = from item in lItems
where WildcardString.IsMatch(item.RecordId.ToString(), filter) ||
WildcardString.IsMatch(item.Tokens.ToString(), filter) ||
WildcardString.IsMatch(string.Format("{0}:{1}", item.OwnerID.SystemName, item.OwnerID.Port.ToString()), filter) ||
WildcardString.IsMatch(item.ChildID.UserName, filter) ||
WildcardString.IsMatch(item.TypeOfLicense.ToString(), filter) ||
WildcardString.IsMatch(item.ExpiryTime.DateTime.ToLocalTime().ToString(), filter)
select item.RecordId.ToString();
我想將此表達式放入函數中,並將在“ where”中使用的約束作為單個參數傳遞。 我該如何實現? 在使用文件屬性時(當您選擇不同的屬性枚舉時),我已經看到了使用按位OR的類似功能,因此,我相信應該可以編寫自己的函數,該函數將一組委托作為“ where”規則。
如果相關,則WildcardString.IsMatch(string,string)是一個布爾函數。 另外,我有三個不同的函數執行完全相同的操作,但在不同的列表上,這就是為什么我想學習如何將其簡化為一個函數,並僅將列表和選擇規則傳入。
只需定義一個謂詞:一個接受item
並返回布爾值的函數。
假設該item
屬於Record
類型,並且該filter
在范圍內:
Func<Record, bool> predicate = r =>
WildCardString.IsMatch(r.RecordId.ToString(), filter) ||
WildCardString.IsMatch(...);
然后,您可以將predicate
視為一等值(將其存儲,將其作為參數傳遞,等等)並使用過濾任何IEnumerable<Record>
var filtered = enumerable.Where(predicate);
好吧,只需將where部分重構為函數即可:
public bool MyIsMatch(MyType item, String filter)
{
return
WildcardString.IsMatch(item.RecordId.ToString(), filter) ||
WildcardString.IsMatch(item.Tokens.ToString(), filter) ||
WildcardString.IsMatch(string.Format("{0}:{1}", item.OwnerID.SystemName, item.OwnerID.Port.ToString()), filter) ||
WildcardString.IsMatch(item.ChildID.UserName, filter) ||
WildcardString.IsMatch(item.TypeOfLicense.ToString(), filter) ||
WildcardString.IsMatch(item.ExpiryTime.DateTime.ToLocalTime().ToString(), filter);
}
然后調用它:
var showIndexes = from item in lItems where MyIsMatch(item, filter) select item.ToString();
您可以創建一個Is.Match版本,該版本采用有效值列表
public static bool IsMatch(IEnumerable<object> values, filter) {
return values.All(v => IsMatch(v.ToString(),filter))
}
在您的情況下,您將像這樣使用它
var values = new object[]{
item.RecordId,
item.Tokens,
string.Format("{0}:{1}", item.OwnerID.SystemName, item.OwnerID.Port),
item.ChildID.UserName
item.TypeOfLicense
item.ExpiryTime.DateTime};
var showIndexes = from item in lItems
where WildcardString.IsMatch(values,filter)
select item.RecordId.ToString();
我選擇使用IEnumerable<object>
而不是IEnumerable<string>
從每個項目中刪除.ToString()
,但這確實要花很多錢,因為您將要裝箱和拆箱任何ValueTyped值。 如果它位於確定的性能關鍵路徑上,則應改用IEnumerable<string>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.