2009-11-12 41 views
2

說我有一個類,它看起來是這樣的:在C#中,通過類的成員之一來搜索一個類的列表的最佳方式是什麼?

class SomeClass { 
    int m_member; 

    public int Member { 
     get { return m_member; } 
     set { m_member = value; } 
    } 
} 

而且別的地方,我有List<SomeClass> list類型的列表。

如果我要搜索列表類的特定情況下,我可以做

int index = list.IndexOf(someInstance); 

但如果我要搜索會員名單,我必須這樣做:

int index = -1; 
for (int i = 0; i < list.Count; i++) { 
    if (list[i].Member == someMember) { 
     index = i; 
     break; 
    } 
} 

有沒有更好的方法來做到這一點?

回答

6
int index = list.FindIndex(m => m.Member == someMember); 
+2

如果你需要的項目*,而不是*的指標,您可以用'find()',而不是'FindIndex()'(不是什麼OP要求,只是一個供參考)。 – 2009-11-12 02:47:42

+0

感謝280Z28,在其他地方有用。 – 2009-11-12 03:28:57

3

如果你可以使用LINQ

SomeClass aClasss = list.FirstOrDefault(item => item.Member == someMember); 
+2

如果你正在使用'List ',這不是你想要的,但是它在查找枚舉中的項目時有效 - 請注意它沒有找到該項目的索引。 – 2009-11-12 02:46:23

1

您可以對列表如下圖所示,其中屬性名稱和搜索值的輸入參數的擴展搜索方法(使用反射)。

public static List<T> SearchList<T>(this List<T> list, string PropertyName, string SearchValue) 
{ 
    return list.Select(item => 
     new 
     { 
      i = item, 
      Props = item.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public) 
     }) 
     .Where(item => item.Props.Any(p => 
     { 
      var val = p.GetValue(item.i, null); 
      return val != null 
       && (p.Name.ToLower() == PropertyName.ToLower() || string.IsNullOrEmpty(PropertyName)) 
       && (val.ToString().ToLower().Contains(SearchValue.ToLower()) || string.IsNullOrEmpty(SearchValue)); 
     })) 
     .Select(item => item.i) 
     .ToList(); 
    } 

電話:

List<Employee> employees = new List<Employee>(); 
var searchedEmployees = data.SortList(serachProperty, searchValue); 
+0

謝謝你的答案,佛陀。我認爲你可以通過一些建議來減少混亂/緩慢:1.使用'ToLowerInvariant'而不是'ToLower'進行標準化; 2.在方法的開始處標準化'PropertyName'和'SearchValue',而不是在嵌套循環中調用的lambda表達式; 3.在引用字符串之前檢查'string.IsNullOrEmpty' *,而不是在之後; 4.不需要任何'Select'子句,建議刪除它們並取而代之在'Where'子句中獲取屬性。 – 2016-05-18 02:06:35

+2

對於任何人都難以回答的問題:考慮使用反射是否真的是您的場景的正確選擇。使用反射速度很慢,增加了不必要的複雜性,並喪失了類型安全的大多數好處。考慮設計一個適合您的特定過濾方案的解決方案。 – 2016-05-18 02:08:42

相關問題