给定两个不同类型的列表,是否可以使这些类型在彼此之间转换或相互比较(例如使用 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/