2013-08-21 52 views
2

我正在製作一個清單,它可以工作。但是我的問題已經改變了所有的蜇入小寫的值。但是因爲我想要計算原始列表中不同值的出現次數,爲此,我使用嵌套for循環並計算值,因此我面臨的問題是在某些蜇傷中存在空間最後。所以當比較這兩個字符串時,它們不匹配,因爲那時候的空間會導致不同的列表具有相同的兩個值。有沒有解決這個在不同列表的c#中創建一個列表

var distinctList = list.Distinct(); 

回答

6

您需要Trim()第一任何方式Distinct()

var list = new[] {" string", "string "}; 
var distinctList = list.Select(s => s.Trim()).Distinct(); 

之前,如果你還需要忽略大小寫:

var list = new[] {" String", "string "}; 
var distinctList = list.Select(s => s.Trim()) 
         .Distinct(StringComparer.InvariantCultureIgnoreCase); 

如果列表中包含null ,大概你會忽略它,你可以很容易地先過濾:

var list = new[] {" String", "string ", null}; 

var distinctList = list.Where(s => !string.IsNullOrEmpty(s)) 
         .Select(s => s.Trim()) 
         .Distinct(StringComparer.InvariantCultureIgnoreCase); 

如果你需要保持null的結果,建立一個擴展方法來定製Trim()

public static string CusTrim(this string @this) 
    { 
     return @this == null ? null : @this.Trim(); 
    } 

然後,您可以撥打:

var distinctList = list.Select(s => s.CusTrim()) 
         .Distinct(StringComparer.InvariantCultureIgnoreCase); 
+0

所以只有在在末尾的空格 –

+0

您可以使用TrimEnd,因爲根據OP只有尾隨空格。 – Servy

+1

這會時間,但所有的字符串不是與spac的 –

0

可以過濾使用LINQ。

var destinctList = list.Where(x => !String.IsNullOrWhiteSpace(x)).Select(x => x.TrimEnd()).Distinct().ToList(); 

這也將刪除空字符串

0

你可以做這樣的事情.....

list.Select(i => i.Trim()).Distinct(); 
+1

@CongLong已經回答了,和's'和'i'完全相同 – Satpal

4

有一個更好的辦法。首先,正如Cuong正確顯示的那樣,您應該修整您的值以刪除前導或尾隨空格。其次,如果您想要每個不同值的出現次數,您可以將它們分組並在同一個Linq語句中對它們進行計數。它可能看起來像這樣(編輯:你提到你有你想保留一些空值,當你調用你的列表元素的方法,你必須考慮到):

var groupedCounts = list.Select(s=>s == null ? s : s.ToLowerInvariant().Trim()) 
        .GroupBy(x=>x) 
        .Select(g=>new {g.Key, g.Count()}); 

小組創建了一個「查找「,基本上是一個只讀,鍵控的IEnumerables集合,其中鍵是基於分組投影的(這裏我們只是想比較字符串,但您可以想象也可以按照第一個字符或其他方式進行分組)。然後,最後一個選擇會創建一個包含Key和Count兩個字段的「匿名類型」(它們是基於它們獲得的值自動命名的)。

請注意,使用匿名類型僅限於本地範圍;你不能以強類型的方式返回這個集合,因爲根據定義它不是一個「強類型」。如果這個列表需要去別的地方,比如被設置爲一個實例屬性或者從你當前的方法返回,你可以創建Tuples而不是匿名類實例,或者KeyValuePairs等。