小编典典

如何将 linq 结果转换为 HashSet 或 HashedSet

all

我在一个 ISet 类上有一个属性。我正在尝试将 linq 查询的结果放入该属性中,但不知道该怎么做。

基本上,寻找这个的最后一部分:

ISet<T> foo = new HashedSet<T>();
foo = (from x in bar.Items select x).SOMETHING;

也可以这样做:

HashSet<T> foo = new HashSet<T>();
foo = (from x in bar.Items select x).SOMETHING;

阅读 57

收藏
2022-06-21

共1个答案

小编典典

我不 认为 有任何内置的东西可以做到这一点......但编写扩展方法真的很容易:

public static class Extensions
{
    public static HashSet<T> ToHashSet<T>(
        this IEnumerable<T> source,
        IEqualityComparer<T> comparer = null)
    {
        return new HashSet<T>(source, comparer);
    }
}

请注意,您确实需要一个扩展方法(或至少是某种形式的通用方法),因为您可能无法明确表达 的类型T

var query = from i in Enumerable.Range(0, 10)
            select new { i, j = i + 1 };
var resultSet = query.ToHashSet();

你不能通过显式调用HashSet<T>构造函数来做到这一点。我们依靠泛型方法的类型推断来为我们做这件事。

现在您 可以 选择命名ToSet并返回ISet<T>- 但我会坚持使用ToHashSet具体类型。这与标准 LINQ 运算符 (
ToDictionary, ToList) 一致,并允许将来扩展 (例如ToSortedSet)。您可能还希望提供指定要使用的比较的重载。

2022-06-21