c# - LINQ:通过使它们可转换/可比较来对不同类型的集合使用 .Except()?

标签 c# linq comparison equality comparable

给定两个不同类型的列表,是否可以使这些类型在彼此之间转换或相互比较(例如使用 TypeConverter 或类似的)以便 LINQ 查询可以比较它们?我在 SO 上看到过其他类似的问题,但没有任何内容表明可以使类型在彼此之间转换以解决问题。

集合类型:

public class Data
{
    public int ID { get; set; }
}

public class ViewModel
{
    private Data _data;

    public ViewModel(Data data)
    {
        _data = data;
    }
}

期望的用法:

    public void DoMerge(ObservableCollection<ViewModel> destination, IEnumerable<Data> data)
    {
        // 1. Find items in data that don't already exist in destination
        var newData = destination.Except(data);

        // ...
    }

这似乎合乎逻辑,因为我知道如何将 ViewModel 的实例与 Data 的实例进行比较,所以我应该能够提供一些比较逻辑,然后 LINQ 将用于 .Except() 等查询。这可能吗?

最佳答案

我假设提供来自 Data 的投影至 ViewModel是有问题的,所以除了 Jason 的解决方案之外,我还提供了另一种解决方案。

Except 使用哈希集(如果我没记错的话),因此您可以通过创建自己的哈希集来获得类似的性能。我还假设您正在识别 Data对象在 IDs 时是平等的是平等的。

var oldIDs = new HashSet<int>(data.Select(d => d.ID));
var newData = destination.Where(vm => !oldIDs.Contains(vm.Data.ID));

您可能在该方法的其他地方对“oldData”集合有另一种用途,在这种情况下,您会想要改为执行此操作。要么实现IEquatable<Data>在您的数据类上,或创建自定义 IEqualityComparer<Data>对于哈希集:

var oldData = new HashSet<Data>(data);
//or: var oldData = new HashSet<Data>(data, new DataEqualityComparer());
var newData = destination.Where(vm => !oldData.Contains(vm.Data));

关于c# - LINQ:通过使它们可转换/可比较来对不同类型的集合使用 .Except()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9998549/

相关文章:

c# - WinRT - 在控件中显示动画 GIF

c# - 如何在 C# 中使用 VTK 进行 3D 体积渲染

c# - WCF 数据服务,不要公开所有列

c# - Xamarin Forms PCL 如何从 iOS customRenderer 进行 PushAsync

testing - 什么是好的经验法则浮点比较方法选择器?

c# - Linq 混合扩展和查询语法

c# - 如何读取特定名称的所有 XML 节点并将它们放入数组(或列表)中?

sql-server - 如果使用 Linq,是否必须手动关闭 SQL 连接?

javascript - 为什么 Javascript 严格比较会这样做?

MySQL:查找数据库和数组中的值之间的存在性