2013-08-21 64 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等。

相关问题