改进双属性数据结构

本文关键字:数据结构 属性 | 更新日期: 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...
        }
    }
}