我有一个类,它包含一些字符串成员,一些双成员和一些数组对象.
我创建了这个类的两个对象,是否有任何最简单,有效的方法来比较这些对象并说它们相等?有什么建议?
我知道如何编写比较函数,但这会耗费时间.
我使用c#将数据从XML文件读入DataSet,而不是想要识别该集合中的重复(完全相同)行.我试过这样的分组,这很有效!
var d= from r1 in table.AsEnumerable()
group r1 by new
{
t0 = r1[0],
t1 = r1[1],
t2 = r1[2],
t3 = r1[3],
t4 = r1[4],
t5 = r1[5],
t6 = r1[6],
t7 = r1[7],
t8 = r1[8],
}
into grp
where grp.Count() > 1
select grp;
Run Code Online (Sandbox Code Playgroud)
但是数据列的数量可能不同,因此我无法在上面的查询中应用静态分组.我必须动态生成分组数组?
我不想删除dublicate,我只是想找到它们!
我有一堆Expression<Func<T, bool>>谓词,我想比较它们的平等性.有没有办法做到这一点?
背景:我的库将项目排序为"bins",由谓词是否返回true来控制.如果调用者想要创建一个新的bin,我想看看bin是否已经存在.
我有一个大模型
public class SomeModel
{
public int Id { get; set; }
.....A lot(24) of Fields here.....
}
Run Code Online (Sandbox Code Playgroud)
现在,Post ActionResult Edit(somemodel SomeModel)我想检查用户是否已根据数据库中的原始模型值更改了任何内容.使用If Elsemake会产生很多混乱的代码.无论如何都要检查用户是否更改了某些内容,以及可能的用户更改了哪些字段?
可能的重复:
比较 c# 中的对象属性
假设我有一个 POCO:
public class Person
{
public string Name { get; set; }
public DateTime DateOfBirth { get; set; }
public IList<Person> Relatives { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我想比较两个 Person 实例,看看它们是否相等。当然,我会比较Name、DateOfBirth和Relatives集合,看看它们是否相等。但是,这将涉及我覆盖Equals()每个 POCO 并手动编写每个字段的比较。
我的问题是,我怎样才能编写一个通用版本,这样我就不必为每个 POCO 都这样做?
我有两个类Address和Employee如下:
public class Address
{
public string AddressLine1 { get; set; }
public string AddressLine2 { get; set; }
public string City { get; set; }
public string State { get; set; }
public string Zip { get; set; }
}
public class Employee
{
public string FirstName { get; set; }
public string MiddleName { get; set; }
public string LastName { get; set; }
public Address EmployeeAddress { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我有两个员工实例如下:
var emp1Address = new Address(); …Run Code Online (Sandbox Code Playgroud) 我有许多数据类,它们具有超过25种不同值类型的属性(随着需求的变化,这可能在将来发生变化).我想覆盖equals,主要用于单元测试目的.
目前,我知道如何做到这一点的唯一方法是实际测试硬编码的每个属性的相等性.这看起来很糟糕有两个原因 - 首先,我将编写大量代码来测试25个属性的相等性 - 第二,如果其中一个类中的属性在稍后的时间点添加,则Equals方法将不会检查这很可能会被忽视并导致问题.
由于Equals通常会检查类的属性,因此应该有一种方法来动态比较要比较的类的属性,这可以确保对类的属性更改不会导致Equals的错误实现.有没有办法做到这一点?
我有一个有很多属性的课程.浅拷贝足以完全复制对象.
我需要比较一个对象,以检查它是否包含与另一个完全相同的值.
我的想法:
第一个也是最明显的解决方案就是创建一个巨大的方法块,一个接一个地比较每个属性.
第二种方法是序列化每个对象并散列文件或对其执行某种md5校验和.(这实际上是否有效).
第三种是对对象进行某种反思,这会自动化第一个选项,但会增加复杂程度.
速度真的不是问题.
有兴趣听到思想,或者我缺少的任何其他方法来做这样的事情.
编辑:谢谢大家.我的解决方案:(现在修改为通用项目的递归).
public static bool IsSame<T>(T objA, T objB)
{
var type = typeof(T);
var properties = type.GetProperties();
foreach (var pi in properties.Where(a => a.CanRead))
{
if (pi.Name == "Item")
{
var piCount = properties.FirstOrDefault(a => a.Name == "Count");
int count = -1;
if (piCount != null && piCount.PropertyType == typeof(System.Int32))
count = (int)piCount.GetValue(objA, null);
if (count > 0)
{
for (int i = 0; i < count; i++)
{
dynamic child1 = …Run Code Online (Sandbox Code Playgroud) 我经常使用代表工厂生产的实体的类.为了使我的工厂简单的测试很容易,我通常执行IEquatable<T>,同时也覆盖GetHashCode和Equals(由所建议的MSDN).
例如; 采用以下实体类,这是为了示例目的而简化的.通常我的类有更多属性.偶尔会有一个集合,在Equals我检查的方法中使用SequenceEqual.
public class Product : IEquatable<Product>
{
public string Name
{
get;
private set;
}
public Product(string name)
{
Name = name;
}
public override bool Equals(object obj)
{
if (obj == null)
{
return false;
}
Product product = obj as Product;
if (product == null)
{
return false;
}
else
{
return Equals(product);
}
}
public bool Equals(Product other)
{
return Name == other.Name; …Run Code Online (Sandbox Code Playgroud) 我有一个包含大约20个属性的组件的数据库.要确定是否需要更新,我想检查两个对象的所有属性(DateCreated和Id除外)是否匹配.如果所有匹配都没有更新,如果没有,则更新db.
Component comp_InApp = new Component()
{
Id = null,
Description = "Commponent",
Price = 100,
DateCreated = "2019-01-30",
// Twenty more prop
};
Component comp_InDb = new Component()
{
Id = 1,
Description = "Component",
Price = 100,
DateCreated = "2019-01-01",
// Twenty more prop
};
// Check if all properties match, except DateCreated and Id.
if (comp_InApp.Description == comp_InDb.Description &&
comp_InApp.Price == comp_InDb.Price
// Twenty more prop
)
{
// Everything up to date.
}
else
{
// …Run Code Online (Sandbox Code Playgroud) 我这里有一个愚蠢的问题.我定义了一个包含许多数据成员的类,如下所示:
public class A
{
public string Name { get; set; }
public double Score { get; set; }
//...many members
public C Direction { get; set; }
public List<B> NameValue1 { get; set; }
public List<string> NameValue2 { get; set; }
//...many members
}
Run Code Online (Sandbox Code Playgroud)
现在,我正在编写单元测试代码,并希望比较A类的两个实例.但我发现这不起作用:
Assert.AreEquals(a1, a2);
Run Code Online (Sandbox Code Playgroud)
我必须覆盖Equals方法来做到这一点?默认情况下C#无法解决这个问题?或者我可以序列化这两个人并比较文件流?
谢谢.
c# ×10
.net ×2
asp.net ×2
equals ×2
.net-core ×1
asp.net-mvc ×1
c#-4.0 ×1
compare ×1
comparison ×1
duplicates ×1
generics ×1
iequatable ×1
linq ×1
poco ×1
properties ×1
reflection ×1
unit-testing ×1