加入两个不同类型的列表并按日期排序

kba*_*che 6 c# list

我有这样的第一个实体列表:

public partial class Networking :EntityBase
{

    public virtual int NetWorkingId
    {
        get;
        set;
    }

    public virtual string NetWorkingParam
    {
        get;
        set;
    }

    public virtual System.DateTime NetWorkingDate
    {
        get;
        set;
    }
}
Run Code Online (Sandbox Code Playgroud)

我有第二个这样的实体列表:

public partial class PrivateNetwork :EntityBase
{
    public virtual int PrivateNetworkId
    {
        get;
        set;
    }

    public virtual int ContaId
    {
        get { return _contaId; }
        set
        {
            if (_contaId != value)
            {
                if (Contact != null && Contact.ContaId != value)
                {
                    Contact = null;
                }
                _contaId = value;
            }
        }
    }

    public virtual Nullable<System.DateTime> DateCreation
    {
        get;
        set;
    }
}
Run Code Online (Sandbox Code Playgroud)

我想在一个中收集这两个列表,并按日期对所有元素进行排序.

那可能吗 ?

khe*_*ang 5

使用多态可以很容易地解决这个问题; 为这两个类使用公共基类或接口,这些类具有DateTime要排序的属性.

例:

public abstract class NetworkingBase : EntityBase
{
    public DateTime DateToSortOn { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

要么

public interface INetworking
{
    public DateTime DateToSortOn { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后让你的类派生NetworkingBase或实现INetworking:

public partial class Networking : NetworkingBase
{
    ...
}

public partial class PrivateNetwork : NetworkingBase
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

要么

public partial class Networking : EntityBase, INetworking
{
    ...
}

public partial class PrivateNetwork : EntityBase, INetworking
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

做一个LINQ UnionConcat然后在OrderBy对所得到的集合.

  • 事实并非如此(需要共同基础*); 可以创建"联合"对象 - 匿名或命名 - 然后可以对其进行排序/存储.不需要共同的基础. (5认同)
  • +1:或者,如果您无权访问 - 或无法更改 - "EntityBase",则在其上定义一个包含日期(以及您想要的任何其他内容)的接口,并让两个类都实现新接口.然后,您可以将两个序列强制转换为接口类型,并对接口的日期成员进行排序. (2认同)

Raw*_*ing 5

你可以做到这一点,虽然它不是很漂亮,你最终会得到一个,IEnumerable<object>所以你必须检查每个项目的类型才能使用它:

IEnumerable<object> sorted = myNetworkingList
    .Concat<object>(myPrivateNetworkList)
    .OrderBy(n => n is Networking
                 ? (DateTime?)((Networking)n).NetWorkingDate
                 : ((PrivateNetwork)n).DateCreation);

foreach (object either in sorted)
{
    if (either is Networking)
        // Networking; do something
    else
        // PrivateNetwork; do something else
}
Run Code Online (Sandbox Code Playgroud)