代码之家  ›  专栏  ›  技术社区  ›  Matthew

LINQ.distinct方法如何排序?

  •  13
  • Matthew  · 技术社区  · 14 年前

    .Distinct() 方法。 结果是无序的。

    我的问题是关于结果集。结果数组是按“第一个不同的”顺序还是按“最后一个不同的”顺序排列?

    我能永远不指望任何命令吗?

    这是老的“删除重复字符串”问题,但我正在研究LINQ解决方案。

    5 回复  |  直到 14 年前
        1
  •  20
  •   Jon Skeet    14 年前

    假设您的意思是LINQ to对象,它基本上保留了一组到目前为止返回的所有结果,并且只有在以前没有生成“current”项的情况下才会生成它。所以结果是按原来的顺序,删除重复项。类似这样的东西(除了错误检查等):

    public static IEnumerable<T> Distinct<T>(this IEnumerable<T> source)
    {
        HashSet<T> set = new HashSet<T>();
    
        foreach (T item in source)
        {
            if (set.Add(item))
            {
                // New item, so yield it
                yield return item;
            }
        }
    }
    

    Distinct() 尽可能的懒惰-数据会尽快返回,并且只缓冲最小数量的数据。

    开始 Distinct ,并且当您 数据来自 明显的

        2
  •  8
  •   Gabriel Magana    14 年前

    这个 docs 说:

    “结果序列无序。”

        3
  •  3
  •   Billy ONeal IS4    14 年前

        4
  •  1
  •   Mark Byers    14 年前

    据我所知,Distinct方法并不能正式保证一个顺序,尽管实际上LINQ to Objects实现按组在源可枚举文件中首次出现的顺序返回组。

    例如,如果您使用LINQ to SQL,则由数据库决定它希望返回结果的顺序,然后您不应该依赖这个顺序,即使是从一个调用到下一个调用的顺序是一致的。

        5
  •  1
  •   Jerry Coffin    14 年前