创建一个接口来排序3个不同对象的数组

时间:2015-08-09 23:30:36

标签: c# sorting interface

您好我有3个对象都有一个日期属性,但它们的名称都不同,[ObjectA.CreateDate,ObjectB.DateCreated,ObjectC.DateOfCreation]

我想将所有项目合并到一个数组中,然后按日期排序。它们都从一个唯一的父类继承,因此我将编写一个他们都将使用的接口。

我是界面新手,最好的方法是什么?我可以专门为每个不同的对象编写inits吗?

e.g

interface orderdate
    {
    orderdate (objectA x){
    orderdate.date = x.CreateDate
    }
    orderdate (objectB y){
    orderdate.date = y.DateCreated
    }
    orderdate (objectB z){
    orderdate.date = z.DateOfCreation
    }

    void date (){
    return this.date;
    }

}

然后我能够创建一个orderDate类型的数组,将所有对象添加到它并按照那个inerfaces日期属性对它们进行排序吗?

2 个答案:

答案 0 :(得分:2)

你需要做这样的事情来建立一个共同的界面:

public interface ISortByDate
{
    DateTime SortByDate { get; }
}

public class ObjectA : ISortByDate
{
    public DateTime CreateDate { get; set; }

    DateTime ISortByDate.SortByDate { get { return this.CreateDate; } }
}

public class ObjectB : ISortByDate
{
    public DateTime DateCreated { get; set; }

    DateTime ISortByDate.SortByDate { get { return this.DateCreated; } }
}

public class ObjectC : ISortByDate
{
    public DateTime DateOfCreation { get; set; }

    DateTime ISortByDate.SortByDate { get { return this.DateOfCreation; } }
}

然后,您将能够创建单个列表以将这三种类型中的任何一种添加到:

var list = new List<ISortByDate>();

然后你可以做你喜欢的所有排序。

答案 1 :(得分:1)

有多种排序方式。

您可以定义具有要排序的属性的接口。您希望在日期排序的所有类都应使用此接口:

public interface IOrderDate
{
    DateTime CreateDate { get; }
}

实现IOrderDate的ObjA示例:

public class ObjA : IOrderDate
{
    public DateTime DateOfCreation { get; set; }

    public DateTime CreateDate
    {
        get { return DateOfCreation; }
    }

    public override string ToString()
    {
        return string.Format("DateOfCreation: {0}", DateOfCreation);
    }
}

也实现IOrderDate的ObjB示例:

public class ObjB : IOrderDate
{
    public DateTime CreationDate { get; set; }

    public DateTime CreateDate
    {
        get { return CreationDate; }
    }

    public override string ToString()
    {
        return string.Format("CreationDate: {0}", CreationDate);
    }
}

使用LINQ

// Create the list.
var list = new List<IOrderDate>();
list.Add(new ObjA() { DateOfCreation = DateTime.Now.AddDays(100)});
list.Add(new ObjB() { CreationDate = DateTime.Now.AddDays(-250) });

// Ascending.
list = list.OrderBy(o => o.CreateDate).ToList();

// Decending
list = list.OrderByDescending(o => o.CreateDate).ToList();

使用IComparer

以下类将对IOrderDate接口进行排序:

public class OrderDateComparer : IComparer<IOrderDate>
{
    public int Compare(IOrderDate x, IOrderDate y)
    {
        return x.CreateDate.CompareTo(y.CreateDate);
    }
}

然后,您可以填写列表并进行排序:

// Create the list.
var list = new List<IOrderDate>();
list.Add(new ObjA() { DateOfCreation = DateTime.Now.AddDays(100)});
list.Add(new ObjB() { CreationDate = DateTime.Now.AddDays(-250) });

// Ascending.
list.Sort(new OrderDateComparer());

// Decending
list.Sort(new OrderDateComparer()); // Redundant here.
list.Reverse();