2013-10-17 31 views
1

我想排序成員列表相對於屬性Civic數字的前兩個數字。 如果搜索年份是82,那麼每個以82開頭的公民編號的人都會留在返回的列表中。Linq排序第一個兩個數字在長類型

這是我寫的一個方法返回一個名字中第一個字母的排序列表。

private static List<Member> GetNameList(string searchString) 
{ 
    return _sortMemberList.Where(x => x.FirstName.ToLower().StartsWith(searchString.ToLower())).ToList(); 
} 

我想寫一個相似的方法,但關於公民數。公民號碼長10位,數據類型爲「長」。我知道這不工作,但好,這裏是東西:

private static List<Member> GetMonthList(int searchYear) 
{ 
    return _sortMemberList.OrderBy(x => x.CivicNumber > searchYear).ToList(); 
} 

問候 羅伯特Jarlvik

回答

1

最簡單的,非常低效的做法,簡直是

_sortMemberList.Where(x => x.CivicNumber.ToString().StartsWith(searchYear.ToString())).ToList() 

否則,可能會做

_sortMemberList.Where(x => (x.CivicNumber/100000000) == searchYear).ToList() 

假設你知道所有數字都是inde編10位和searchYear始終是2位

如果列表已經排序,你可以把它更加高效:

_sortMemberList 
    .SkipWhile(x => x.CivicNumber < searchYear*100000000) 
    .TakeWhile(x => (x.CivicNumber/100000000) == searchYear) 
    .ToList() 

更有效的辦法是使用二進制搜索定位下界目標年,但只能做,如果_sortMemberList允許隨機訪問(索引):看到

+1

@羅伯特 - Jarlvik:我想提出的唯一建議是將外部化你的「得到一年數」的邏輯功能,所以你可以這樣做:'.SkipWhile(X => GetYear(x) GetYear(x)== searchYear)'。它更易讀,更易於維護。 –

+0

@AndrewCoonce當然是一個好點。我選擇瞭解效率方面。 – sehe