我有一个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;

推荐答案

我不知道这里面有什么东西...但是编写扩展方法非常容易:

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>构造函数是无法做到这一点的.我们依靠类型推理来实现泛型方法.

现在您could Select 将其命名为ToSet,然后返回ISet<T>-但我将坚持使用ToHashSet和具体类型.这与标准LINQ运算符(ToDictionaryToList)一致,并允许将来扩展(例如ToSortedSet).您可能还希望提供指定要使用的比较的重载.

.net相关问答推荐

SeriLog LogConext.PushProperty在ASP.NET MVC 5中不能使用OWIN中间件

.NET Core 中的微服务

.NET 7.0中的UseHttpsRedirection和IIS生产部署

避免函数和其他对象之间的相互递归的模式?

无法通过构建目标访问 dotnet 的环境变量

lock() 是否保证按请求的顺序获得?

如何将浮点数向上舍入到 C# 中最近的 int?

如何在 C# 4.0 中使任务进入睡眠状态(或延迟)?

如何将字符串列表数据绑定到 WPF/WP7 中的 ListBox?

.NET 4.0 中有内置的二叉搜索树吗?

Linq查询分组并 Select 第一个项目

如何判断对象是否是某种类型的数组?

如何授予所有用户对我的应用程序创建的文件的完全权限?

关于 Enumerable.Range 与传统 for 循环的 foreach 的思考

我不了解应用程序域

当我们按下 Enter 键时启动的 WPF 文本框命令

了解 C# 中的协变和逆变接口

如何从 WCF REST 方法返回自定义 HTTP 状态代码?

C# 相当于 Java 的 Exception.printStackTrace()?

有没有一种简单的方法来判断 .NET Framework 版本?