2 个不同类型的列表相等
假设我们有 2 个集合,至少有 IEnumerable 可以启动 Linq(也假设 .net 4.0):
List<T1> list1;
List<T2> list2;
我可以定义 T1 和 T2 类型的对象之间的相等性。
验证两个列表是否相等(元素顺序不相关)的最佳方法是什么(即首选 .net 接口和 Linq)。
如果我知道对象T1和T2有一个ID,我该如何优化这个问题
Ex为T1和T2,我该如何优化这个问题:
class Device
{
string Id;
string Name;
}
class DeviceInfo
{
string Identifier;
string FriendlyName;
DateTime CreateDate;
}
稍后编辑:
解决方案应该涉及我编写的某种相等比较器,并且足够通用。在某些情况下,两个对象具有相同的 Id 但不同的名称,比较就会失败。例如:
static bool AreEqual(Device device, DeviceInfo deviceInfo)
{
return device.Id == deviceInfo.Identifier &&
device.Name == deviceInfo.FriendlyName;
}
Let's assume we have 2 collections, at least IEnumerable to power on Linq (also assume .net 4.0):
List<T1> list1;
List<T2> list2;
I can define equality between objects of type T1 and T2.
What is the best way (i.e. .net interface and Linq preferred) to verify if the 2 lists are equal (order of elements is not relevant).
How can I optimize this problem if I know that the objects T1 and T2 have an ID
Ex of T1 and T2:
class Device
{
string Id;
string Name;
}
class DeviceInfo
{
string Identifier;
string FriendlyName;
DateTime CreateDate;
}
Later edit:
The solution should involve some sort of equality comparer that I write and is generic enough. There may be cases where 2 objects have the same Id but different name, and comparison should then fail. For example:
static bool AreEqual(Device device, DeviceInfo deviceInfo)
{
return device.Id == deviceInfo.Identifier &&
device.Name == deviceInfo.FriendlyName;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
发布评论
评论(4)
你可以这样做:
List<Device> devices = ...
List<DeviceInfo> deviceInfos = ...
var deviceIds = devices.Select(d => d.Id)
.OrderBy(id => id);
var deviceInfoIds = deviceInfos.Select(d => d.Identifier)
.OrderBy(id => id);
bool areEqual = deviceIds.SequenceEqual(deviceInfoIds);
如果不可能出现重复的 Id,设置语义会派上用场:
bool areEqual = !devices.Select(d => d.Id)
.Except(deviceInfos.Select(d => d.Identifier))
.Any();
如果可能的话,我建议你声明一个 IHasId (或类似的)接口并获取两种类型来实现它。
编辑:
为了响应您的编辑,您可以编写一个IEqualityComparer
实现来完成您想要的操作。看起来真的很难看;您必须从 每个 参数到 DeviceInfo / Device 进行推测性转换,以尝试提取标识符。我真的不推荐这个;对于相等比较器来说,比较完全不同类型的对象是一个坏主意。如果让每种类型都实现一个提供标识符的通用接口,那么事情会容易很多。
比较两个字符串列表并不是很复杂。两种基于列表排序的解决方案都具有 N log (N) 复杂度,且不考虑字符串的大小。更好的解决方案是(伪代码),复杂度为N:
create a dictionary<string, int>
foreach element in list1
if element is in dict
dict[element]++;
else
dict[element] = 1;
foreach element in list2
if element is in dict
dict[element]--;
else
return NOT_EQUAL;
if dict has only 0 values lists are equal
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
假设 .NET 4.0:
更好的解决方案还会检查
foos
和bars
是否具有相同的长度,并且没有任何元素为null
,如下所示出色地。当然,此示例假设集合已按Id
排序。更新:
因此,这是“更好的解决方案”的所有 LINQy 细节:
Assuming .NET 4.0:
A better solution would also check that
foos
andbars
have the same length, and that none of the elements arenull
as well. And of course, this example assumes that the collections are already sorted byId
.Update:
So, here's the "better solution" in all its LINQy detail: