c# - 证明两个列表(包含对象)内容相等的最简单方法
问题描述
我在寻找一种简单的方法来比较和证明两个列表的内容相等时遇到了一些令人沮丧的事情。我在 stackoverflow 上查看了许多解决方案,但都没有成功。一些解决方案看起来需要大量的工作来实现,并且做一些在我看来应该更简单的事情,但也许我太简单了,无法意识到这不能简单地完成:)
我创建了一些细节的小提琴,可以在这里查看:https ://dotnetfiddle.net/cvQr5d
finalResult
或者,请在下面找到完整示例,我在返回对象比较方法(变量)时遇到问题,false
如果正在比较内容,我希望该值为true
:
using System;
using System.Collections.Generic;
using System.Linq;
public class ResponseExample
{
public Guid Id { get; set; } = Guid.Parse("00000000-0000-0000-0000-000000000000");
public int Value { get; set; } = 0;
public string Initials { get; set; } = "J";
public string FirstName { get; set; } = "Joe";
public string Surname { get; set; } = "Blogs";
public string CellPhone { get; set; } = "0923232199";
public bool EmailVerified { get; set; } = false;
public bool CellPhoneVerified { get; set; } = true;
}
public class Program
{
public static void Main()
{
var responseOne = new ResponseExample();
var responseTwo = new ResponseExample();
var responseThree = new ResponseExample();
var responseFour = new ResponseExample();
List<ResponseExample> objectListOne = new List<ResponseExample>();
objectListOne.Add(responseOne);
objectListOne.Add(responseTwo);
List<ResponseExample> objectListTwo = new List<ResponseExample>();
objectListTwo.Add(responseThree);
objectListTwo.Add(responseFour);
bool result = objectListOne.Count == objectListTwo.Count();
Console.WriteLine($"Count: {result}");
bool finalResult = ScrambledEquals<ResponseExample>(objectListOne, objectListTwo);
Console.WriteLine($"Object compare: {finalResult}");
}
//https://stackoverflow.com/a/3670089/3324415
public static bool ScrambledEquals<T>(IEnumerable<T> list1, IEnumerable<T> list2)
{
var cnt = new Dictionary<T,
int>();
foreach (T s in list1)
{
if (cnt.ContainsKey(s))
{
cnt[s]++;
}
else
{
cnt.Add(s, 1);
}
}
foreach (T s in list2)
{
if (cnt.ContainsKey(s))
{
cnt[s]--;
}
else
{
return false;
}
}
return cnt.Values.All(c => c == 0);
}
}
解决方案
正如评论中的人指出的那样,这将不起作用,因为默认情况下比较复杂类型会比较引用是否相同。如果不实现相等方法,逐字段比较将不起作用(然后您需要重载 GetHashCode 等)。请参阅https://docs.microsoft.com/en-us/dotnet/api/system.object.equals?view=net-5.0
但是,如果您可以使用 c# 9,这就是您在小提琴中所拥有的,您可以将类型定义为 arecord
而不是class
. 记录已内置逐场比较。请参阅https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/tutorials/records#characteristics-of-records
public class ResponseExample
会变成这样public record ResponseExample
,您的代码会按预期工作。
推荐阅读
- swift - 如何在 NSTextView 菜单中添加 NSTextTable 编辑功能?
- reactjs - 根据数组中元素的数量生成下拉列表
- python - 计数器 - 跳过元素并且在 for 循环期间不增加
- oauth - 在没有互联网的持续集成环境中模拟 auth0 服务器
- hive - 等效于 HIVE 中的 split_function()
- typo3 - 我想显示我的网站属性中的字段
- r - 如何根据条件为变量添加颜色
- javascript - 在 JavaScript 中按键值将集合分组为集合集合
- php - 在 PHP 中将 12 小时格式转换为 24 小时格式
- kubernetes - 什么时候应该将 envFrom 用于配置映射?