2014-05-15 27 views
0

我有以下函數用於搜索文本匹配的類屬性值,如果它們中的任何一個匹配,則返回true。如何修改lambda語句以從列表索引位置開始並返回該位置

private static List<Func<Type, string>> _properties; 
private static Type _itemType; 

public static bool Match(string searchTerm) 
{ 
    bool match = _properties.Select(prop => prop(_itemType)).Any(value => value != null && value.ToLower().Contains(searchTerm.ToLower())); 
    return match; 
} 

_properties列表按照DataGrid列上的綁定屬性的順序排列。 _itemType是類的類型。

我想要做的是,繼續搜索文本,但是,另外改變它,以便它將從列表中的特定屬性的索引處開始並返回,第一個屬性的索引匹配它爲或爲null。

功能的開始看起來像這樣:

public static int Match(int start_index, string searchTerm) 

能使用找出最好的方式做到這一點一些幫助。

+0

理解這個權利,你想提供一個'out int'來填充第一個匹配的偏移量? –

+0

是的,這是正確的 – Hank

回答

1

這是做你想做的嗎?

​​
  1. 使用選擇與第二指標參數,並將其存儲在一個 匿名類型。
  2. 然後跳過 'start_index'中指定的數字。
  3. 然後搜索剩餘部分,如果找到了,返回 原始索引。
3

如果您想以精確的偏移量啓動它,請使用.Skip(int)函數。

return _properties.Skip(start_index).Sele[...] 

如果你想返回第一個發生的歷史元素的索引,使用.IndexOf()代替.Any()

由於.IndexOf()返回-1,沒有結果,如果你想返回空值,你可以這樣做通過檢查返回值等於-1:

if (result == -1) 
    return null; 

請注意,你將不得不作出的返回值可以爲null INT(= int?),它能夠返回一個空。

編輯

我道歉,IEnumerable■不要有IndexOf()功能有一個沒有索引。您可以嘗試使用.TakeWhile(bool).Count()獲取索引。 另一種方法是使用.ToList().IndexOf(),如果你真的想使用它,但它會慢得多,因爲你必須解析整個對象。

+0

好的四捨五入的答案,並記住可空的返回值謝謝! – Hank

+0

我有這個權利嗎?因爲它不能用.Index替換.Any:_properties.Skip(startPropIndex).Select(prop => prop(_itemType))。any(value => value!= null && value.ToLower()。Contains(searchTerm。降低())); – Hank

+0

也許我錯過了一些東西,但在System.Linq擴展中沒有看到任何IndexOf方法。關於這個答案的另一點(假設IndexOf存在於其他地方)是您應該記得將start_index添加到結果中。 – NeilMacMullen

相關問題