【问题标题】:Improve Data structure with double properties改进具有双重属性的数据结构
【发布时间】:2015-05-25 13:31:50
【问题描述】:

我有数据结构,其中大多数属性与另一个表中的相同。我有 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; }

    } 

我觉得必须有更好的方法来做到这一点。我不喜欢有这么多“相同”的属性两次。我计划有列表,我不只有一个对象,而是很长的对象列表。任何的想法? 感谢帮助。

【问题讨论】:

  • 不,类型相同。但值可以,但不必相同。我更新了我的问题。

标签: c# data-structures


【解决方案1】:

如果我是你,我会创建一个代表一对对象的新类:

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 class

【讨论】:

    【解决方案2】:

    您正在尝试缩短不一定可以或需要更短的内容。您的论点是您可以为所有字段设置单独的值,并且您都需要比较它们,实际上告诉所有这些字段都需要存在。

    为了使这更加优化,您可以添加第二个类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,因此您可以轻松比较它们以检查它们是否相等。

    【讨论】:

      【解决方案3】:

      您可以一次创建具有属性的类并实现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...
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-21
        • 1970-01-01
        • 2020-08-19
        • 1970-01-01
        • 1970-01-01
        • 2018-08-21
        • 1970-01-01
        相关资源
        最近更新 更多