2

我正在制作一个独特的清单,这是有效的。但问题是我也把所有的刺都改成了小写值。但是因为我试图计算原始列表中不同值的出现次数,为此我使用嵌套的 for 循环并计算值,我面临的问题是在某些刺痛中有一个空间在最后。因此,在比较两个字符串时,它们将不匹配,因为 then 处的空间会导致不同的 List 具有相同的两个值。有没有办法解决

var distinctList = list.Distinct();
4

4 回答 4

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);
于 2013-08-21T15:38:19.097 回答
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 集合,其中键基于分组投影(这里我们只想比较字符串,但您也可以按第一个字符或其他字符分组方法)。然后,最后一个 Select 创建一个“匿名类型”,其中包含两个字段,Key 和 Count(它们会根据它们获得的值自动命名)。

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

于 2013-08-21T15:41:39.757 回答
1

你可以做类似的事情......

list.Select(i => i.Trim()).Distinct();
于 2013-08-21T15:40:20.987 回答
0

您可以使用 linq 进行过滤。

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

这也将删除空字符串

于 2013-08-21T15:40:19.483 回答