相对于另一个列表对列表进行排序

本文关键字:列表 排序 另一个 相对于 | 更新日期: 2023-09-27 18:21:24

我创建了一个带有三个字段的c#my类列表。该字段还列出了设备id、设备模式、时间。我已经把我的班级名单按时间排序了。时间列表已成功排序,但设备模式列表未相对于时间列表进行排序。我该如何实现它。下面是我给出的示例代码。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace PBAttendance.App_Code
{
    public class DeviceLogData
    {
        List<int> deviceID = new List<int> { };
        List<int> deviceMode = new List<int> { };
        List<DateTime> time = new List<DateTime> { };
        public List<int> DeviceID
        {
            get { return deviceID; }
            set { deviceID = value; }
        }
        public List<int> DeviceMode
        {
            get { return deviceMode; }
            set { deviceMode = value; }
        }
        public List<DateTime> Time
        {
            get { return time; }
            set { time = value; }
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace PBAttendance.App_Code
{
    public class DeviceLogDataList:List<DeviceLogData>
    {
    }
}
DeviceLogDataList dvclogDataList = new DeviceLogDataList();
DeviceLogData dvclogData = new DeviceLogData();
dvclogData.DeviceID.Add(1);
dvclogData.DeviceMode.Add(1);
dvclogData.Time.Add(DateTime.ParseExact("10:49", "HH:mm", System.Globalization.CultureInfo.InvariantCulture));
dvclogData.DeviceID.Add(1);
dvclogData.DeviceMode.Add(1);
dvclogData.Time.Add(DateTime.ParseExact("10:49", "HH:mm", System.Globalization.CultureInfo.InvariantCulture));
dvclogData.DeviceID.Add(1);
dvclogData.DeviceMode.Add(2);
dvclogData.Time.Add(DateTime.ParseExact("12:51", "HH:mm", System.Globalization.CultureInfo.InvariantCulture));
dvclogData.DeviceID.Add(1);
dvclogData.DeviceMode.Add(2);
dvclogData.Time.Add(DateTime.ParseExact("09:49", "HH:mm", System.Globalization.CultureInfo.InvariantCulture));
dvclogData.DeviceID.Add(1);
dvclogData.DeviceMode.Add(1);
dvclogData.Time.Add(DateTime.ParseExact("13:49", "HH:mm", System.Globalization.CultureInfo.InvariantCulture));
 dvclogDataList.Add(dvclogData);
dvclogDataList[0].Time.Sort();

时间列表被完美地排序为09:49、10:49、10:49,12:51、13:49,但设备模式和设备id没有相对于时间列表进行排序。如何做到这一点。请帮帮我,对不起我英语不好。提前谢谢。

相对于另一个列表对列表进行排序

您应该创建一个保存数据的简单类:

public class DeviceLogData {
    public int DeviceID{get; set;}
    public int DeviceMode{get; set;}
    public DateTime Time {get; set;}
}

void Foo(){
    var theList = new List<DeviceLogData>();
    theList.Add(new DeviceLogData{
        DeviceID: 42,
        DeviceMode: 66,
        Time = DateTime.Now
    });
    ...
    var ordered = theList.OrderBy(log=>log.Time);
    foreach(var log in ordered)
    {
          DoSomethingWithLog(log);
    }
}

[编辑]

正如Servy所指出的,您也可以对列表本身进行排序,而不是枚举其内容。

您可以使用Comparison:

List<DeviceLogData> theList = new List<DeviceLogData>();
theList.Add(new DeviceLogData{        DeviceID: 42,        DeviceMode: 66,        Time = DateTime.Now    });
theList.Add(new DeviceLogData{        DeviceID: 43,        DeviceMode: 67,        Time = DateTime.Now    });
var comparer = new Comparison<DeviceLogData>( 
   // Use the Time property to compare the custom object
   (log1, log2) => log1.Time.CompareTo(log2.Time)
   );
theList.Sort(comparer);

[编辑结束]

关键是将相关数据放在一个对象中。相比之下,当数据被拆分到多个列表中时,同步数据可能很有挑战性。

额外建议:

您应该查看许多可用的通用列表。例如,您还可以使用Dictionary<int,DeviceLogData>以便能够通过Id检索数据。

您需要以某种方式将列表链接在一起。也许制作一个List,其中有一个包含项目的元组,然后对元组的第一个字段进行排序。

或者,制作具有成员TimeDeviceIDDeviceModeDeviceLogEntry

你显然想要完整性,所以为它建模。

也许这可以帮助您完成需要完成的任务:

    public class DeviceLogData
    {
        private static SortedDictionary<DateTime, string> sorteditems = new SortedDictionary<DateTime, string>();
        public int DeviceID { get; set; }
        public int DeviceMode { get; set; }
        public DateTime Time { get; set; }
        public DeviceLogData(int id,int mode,DateTime dt)
        {
            DeviceID = id;
            DeviceMode = mode;
            Time = dt;
            sorteditems.Add(dt, string.Format("At {0} Device with Id -> {1} and mode -> {2} has logged!", dt, id, mode));
        }
        public static SortedDictionary<DateTime, string> GetRecords()
        {
            return sorteditems;
        }
    }

然后使用它,你可以这样做:

            List<DeviceLogData> dlr = new List<DeviceLogData>();
            dlr.Add(new DeviceLogData(1, 1, DateTime.ParseExact("12:51", "HH:mm", System.Globalization.CultureInfo.InvariantCulture)));
            dlr.Add(new DeviceLogData(1, 2, DateTime.ParseExact("10:49", "HH:mm", System.Globalization.CultureInfo.InvariantCulture)));
            dlr.Add(new DeviceLogData(1, 1, DateTime.ParseExact("13:49", "HH:mm", System.Globalization.CultureInfo.InvariantCulture)));
            dlr.Add(new DeviceLogData(1, 1, DateTime.ParseExact("09:49", "HH:mm", System.Globalization.CultureInfo.InvariantCulture)));
            dlr.Add(new DeviceLogData(1, 3, DateTime.ParseExact("09:48", "HH:mm", System.Globalization.CultureInfo.InvariantCulture)));
            dlr.Add(new DeviceLogData(1, 1, DateTime.ParseExact("15:31", "HH:mm", System.Globalization.CultureInfo.InvariantCulture)));
            foreach (var item in DeviceLogData.GetRecords())
            {
                Console.WriteLine(item.Value);
            }
            Console.ReadLine();