我正在製作一個清單,它可以工作。但是我的問題已經改變了所有的蜇入小寫的值。但是因爲我想要計算原始列表中不同值的出現次數,爲此,我使用嵌套for循環並計算值,因此我面臨的問題是在某些蜇傷中存在空間最後。所以當比較這兩個字符串時,它們不匹配,因爲那時候的空間會導致不同的列表具有相同的兩個值。有沒有解決這個在不同列表的c#中創建一個列表
var distinctList = list.Distinct();
我正在製作一個清單,它可以工作。但是我的問題已經改變了所有的蜇入小寫的值。但是因爲我想要計算原始列表中不同值的出現次數,爲此,我使用嵌套for循環並計算值,因此我面臨的問題是在某些蜇傷中存在空間最後。所以當比較這兩個字符串時,它們不匹配,因爲那時候的空間會導致不同的列表具有相同的兩個值。有沒有解決這個在不同列表的c#中創建一個列表
var distinctList = list.Distinct();
您需要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);
可以過濾使用LINQ。
var destinctList = list.Where(x => !String.IsNullOrWhiteSpace(x)).Select(x => x.TrimEnd()).Distinct().ToList();
這也將刪除空字符串
有一個更好的辦法。首先,正如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等。
所以只有在在末尾的空格 –
您可以使用TrimEnd,因爲根據OP只有尾隨空格。 – Servy
這會時間,但所有的字符串不是與spac的 –