2015-12-08 105 views
9

我從數據庫Sytem.Collections.generic.IList獲得通過searchText其過濾:排序列表對象

String searchText="E"; 
var query = something().List(); 
query = query.Where(x => !string.IsNullOrEmpty(x.Name) && 
x.Name.ContainsInsensitive(searchText)).ToList(); 
result = query.Select().ToList(); 

現在我想這個結果是由Name列進行排序。首先以searchText開頭的所有值,然後是包含searchText的所有值。

如果我這樣寫:

result = result.OrderBy(x => x.Name).ToList(); 

我得到的結果是按名稱進行排序,例如:這一切

1. "A name"  
2. "B name" 
3. "E name" 
4. "F name" 

包含Namee。我想,我的排序是:

1. "E name"  
2. "A name" 
3. "B name" 
4. "F name" 

我應該在我OrderBy表情的變化?

+1

我不認爲這是可能的默認情況下。在字符串上排序的工作方式不同 –

+6

@AmitKumarGhosh - 默認情況下很少有可能「。這就是編程位進來的地方;) – Jamiec

+0

我跳過了'searchText'部分。是。真正。 –

回答

13

鏈一起2個訂單OrderByThenBy

.OrderBy(x => x.Name.StartsWith(searchText) ? 0 : 1) 
.ThenBy(x => x.Name) 
+0

謝謝。有用。 – Simon

10

您可以接連做了兩個排序電話(第一OrderBy,所有後續ThenBy):

result.OrderBy(x => !x.Name.StartsWith(searchText)).ThenBy(x => x.Name).ToList(); 

這將整理真(1)首先,然後(0)爲假。 !x.Name使命令正確。然後它在兩個組中排序x.Name

1

我覺得這是更準確:

result.OrderByDescending(x=>Regex.Split(x.Name, searchText, RegexOptions.IgnoreCase).Count()).ToList(); 

甚至更​​好:

result.OrderByDescending(x => 
    Regex.Split(x.Name, searchText, RegexOptions.IgnoreCase) 
    .Sum(el => el.StartsWith(searchText, StringComparison.InvariantCultureIgnoreCase) ? 1 : 0) 
).ToList(); 
+0

你爲什麼這麼認爲? –

+0

計算名稱中存在searchText的次數 – csharpwinphonexaml

+0

那麼爲什麼它更精確?按照OP的要求,它在哪裏檢查'開始'? –

3

那麼,根據你的代碼中有result物化List<T>

result = query.Select().ToList(); 

然後你是重建重新分配名單:

result = result.OrderBy(x => x.Name).ToList(); 

所以我建議整理in-place而不是OrderBy

result.Sort((x, y) => { 
    if (x.Name.StartsWith(searchText)) { 
     if (!y.Name.StartsWith(searchText)) 
     return 1; 
    } 
    else if (y.Name.StartsWith(searchText)) 
     return -1; 

    return String.Compare(x.Name, y.Name); 
    }); 
2

我想你關心的是搜索字符串的索引。所以與searchText相匹配的字符串將會成爲第一個。這裏是例子:

String searchText = "E"; 
List<string> result = new List<string> 
{ 
    "B name", 
    "A name", 
    "E name", 
    "FE name", 
}; 


result = result.OrderBy(x => x.IndexOf(searchText, StringComparison.OrdinalIgnoreCase)).ThenBy(x=>x).ToList(); 

你會得到

"E name", 
"FE name", 
"A name", 
"B name", 

但如果它不是你找什麼,然後用StartsWith像在其他的答案。

+2

這是一個我還沒有想到的好方法。問題是,它沒有按預期對其餘部分進行排序,因爲'A'現在在'FE'之後排序。 –

+0

@PatrickHofman首先根據'searchText'排序。 '一個名字'在最後一個位置有'e',但'FE名'在第二個位置有'e',所以它在'A名字'之前成爲' –

+0

我知道,但這可能不是OP所期望的。 –