繁体   English   中英

使列表在不同列表的c#中不同

[英]Making a list distinct in c# of a distinct list

我正在制作一份有效的清单。 但问题是我已将所有刺痛变为小例值。 但是因为我试图计算原始列表中不同值的出现次数,为了做到这一点,我使用嵌套for循环并计算值,我面临的问题是在某些蜇中有一个空格在末尾。 因此,当比较两个字符串时,它们将不匹配,因为当时的空格会导致不同的List具有相同的两个值。 有没有办法解决

var distinctList = list.Distinct();

在做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);

还有更好的方法。 首先,正如Cuong正确显示的那样,您应该修剪您的值以删除前导或尾随空格。

其次,如果您想要每个不同值的出现次数,您可以对它们进行分组并在同一Linq语句中对它们进行计数。 它可能看起来像这样(编辑:你提到你有一些你想要保留的空值,当你在列表元素上调用方法时必须考虑到这些值):

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

该组创建了一个“查找”,基本上是IEnumerables的只读,键控集合,其中键基于分组投影(这里我们只想比较字符串,但您可以想象也可以按第一个字符或其他字符分组)手段)。 然后,最后一个Select创建一个“匿名类型”,其中包含两个字段:Key和Count(它们是根据它们获得的值自动命名的)。

请注意,匿名类型的使用仅限于本地范围; 你不能以强类型的方式返回这个集合,因为根据定义它不是一个“强类型”。 如果此列表需要转到其他位置,例如设置为实例属性或从当前方法返回,则可以创建元组而不是匿名类实例,或KeyValuePairs等。

你可以使用linq过滤。

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

这也将删除空字符串

你可以做点什么......

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM