改进双属性数据结构
本文关键字:数据结构 属性 | 更新日期: 2023-09-27 17:50:36
我有数据结构,其中大多数属性都来自另一个表。我有Component1, Code1, Description1和Argument1,我有相同的东西,但来自不同的表(Component2, Code2, Description2和Argument2)。这些属性可以是相同的,也不必是相同的。
第一个表是新导入的数据,第二个表是旧数据。现在我需要比较这些数据,并根据一些逻辑选择一个或另一个。我需要这种数据结构的一个重要原因是,我需要检查Code1是否等于Code2(参数、组件和描述也是如此)。
public class ImportData
{
private int id { get; set; }
private int Component1 { get; set; }
private int Component2 { get; set; }
private string Code1 { get; set; }
private string Code2 { get; set; }
private string Description1 { get; set; }
private string Description2 { get; set; }
private string Argument1 { get; set; }
private string Argument2 { get; set; }
private bool isValid { get; set; }
}
我有一种感觉,一定有更好的方法来做这件事。我不喜欢有那么多相同的属性2次。我计划有一个List,我不是只有一个对象,而是一个很长的对象列表。任何想法?谢谢你的帮助。
如果我是你,我会创建一个代表一对对象的新类:
public class Pair<T>
{
public T Item1 { get; set; }
public T Item2 { get; set; }
}
(或者如果你想让它不可变,删除set
并添加一个构造函数,将这两个项作为参数)
那么你可以这样定义ImportData
:
public class ImportData
{
private int id { get; set; }
private Pair<int> Component { get; set; }
private Pair<string> Code { get; set; }
private Pair<string> Description { get; set; }
private Pair<string> Argument { get; set; }
private bool isValid { get; set; }
}
这单独使您的代码更具可读性,这是一件好事。但是,您可以向Pair
类添加额外的实用程序成员,例如ItemsAreEqual
,这将帮助您防止代码重复。
更新:作为创建Pair
类的替代方法,请查看已经存在的Tuple类
你在努力使那些不一定能或不需要变短的东西变短。你的论点是你可以为所有字段设置单独的值,并且你都需要比较它们,实际上告诉所有这些字段都需要在那里。
为了使其更优化,您可以添加第二个类Data
,您将在类中引用它:
public class Data
{
private int Component { get; set; }
private string Code { get; set; }
private string Description { get; set; }
private string Argument { get; set; }
}
和原来的类:
public class ImportData
{
private int id { get; set; }
private Data Left { get; set; }
private Data Right { get; set; }
private bool IsValid { get; set; }
}
一个好处是您可以在Data
类中派生Equals
,因此您可以轻松地比较它们以检查它们是否相等。
您可以只创建一次带有属性的类并实现IComparable接口。
public class Data : IComparable
{
public int Component { get; set; }
public string Code { get; set; }
public string Description { get; set; }
public string Argument { get; set; }
public int CompareTo(object obj) {
var other = obj as Data;
if(other == null)
{
throw new ArgumentException("Object is not Data");
}
else
{
//compare current instance to other here...
}
}
}