簡體   English   中英

如何在C#中傳遞多個函數作為約束參數?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM