相对于另一个列表对列表进行排序
本文关键字:列表 排序 另一个 相对于 | 更新日期: 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
,其中有一个包含项目的元组,然后对元组的第一个字段进行排序。
或者,制作具有成员Time
、DeviceID
和DeviceMode
的DeviceLogEntry
。
你显然想要完整性,所以为它建模。
也许这可以帮助您完成需要完成的任务:
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();