使用双重属性改进数据结构

时间:2015-05-25 13:31:50

标签: c# data-structures

我有数据结构,其中大多数属性与另一个表相同。我有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,我没有一个对象,但这个对象的列表很长。任何的想法? 感谢帮助。

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

你正在努力使事情更短,但不一定能够或者必须更短。你的论点是你可以为所有字段设置单独的值,并且你们都需要比较它们,实际上告诉所有这些字段需要在那里。

为了使其更加优化,您可以添加第二个课程<div class="container text-center"> <h2>&nbsp; </h2> <h2> <strong>IPhone 6 features image gallery </strong></h2> <div class="carousel slide" id="screenshot-carousel" data-ride="carousel"> <ol class="carousel-indicators"> <li data-target="#screenshot-carousel" data-slide-to="0" class="active"></li> <li data-target="#screenshot-carousel" data-slide-to="1"></li> <li data-target="#screenshot-carousel" data-slide-to="2"></li> <li data-target="#screenshot-carousel" data-slide-to="3"></li> <li data-target="#screenshot-carousel" data-slide-to="4"></li> <li data-target="#screenshot-carousel" data-slide-to="5"></li> <li data-target="#screenshot-carousel" data-slide-to="6"></li> <li data-target="#screenshot-carousel" data-slide-to="7"></li> </ol> <div class="carousel-inner"> <div class="item active"> <img src="http://lorempixel.com/400/400/sports/1" alt="Introducing the new IPhone 6 & IPhone 6 Plus"> <div class="carousel-caption"> </div> </div> <div class="item"> <img src="http://lorempixel.com/400/400/sports/2" alt="All new sensors"> <div class="carousel-caption"> </div> </div> <div class="item"> <img src="http://lorempixel.com/400/400/sports/3" alt="Improved camera"> <div class="carousel-caption"> </div> </div> <div class="item"> <img src="http://lorempixel.com/400/400/sports/8" alt="Security. Right at your fingertip with Touch ID"> <div class="carousel-caption"> </div> </div> <div class="item"> <img src="http://lorempixel.com/400/400/sports/4" alt="Introducing the new IOS"> <div class="carousel-caption"> </div> </div> <div class="item"> <img src="http://lorempixel.com/400/400/sports/5" alt="Extremely thin"> <div class="carousel-caption"> </div> </div> <div class="item"> <img src="http://lorempixel.com/400/400/sports/6" alt="Hugely powerpul and enormously efficient"> <div class="carousel-caption"> </div> </div> <div class="item"> <img src="http://lorempixel.com/400/400/sports/7" alt="Bigger screen"> <div class="carousel-caption"> </div> </div> <a href="#screenshot-carousel" class="left carousel-control" data-slide="prev"> <span class="glyphicon glyphicon-chevron-left"></span> </a> <a href="#screenshot-carousel" class="right carousel-control" data-slide="next"> <span class="glyphicon glyphicon-chevron-right"></span> </a> </div> </div> </div> ,您将在课程中引用它:

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; } } 课程中派生Equals,这样您就可以轻松地比较它们以检查它们的平等性。

答案 2 :(得分:1)

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