列表按多个参数排序

本文关键字:参数 排序 列表 | 更新日期: 2023-09-27 18:13:17

我有一个.csv文件,其中包含以下标题和文件中的示例行。

AgentID,Profile,Avatar,In_Time,Out_Time,In_Location,Out_Location,Target_Speed(m/s),Distance_Traveled(m),Congested_Duration(s),Total_Duration(s),LOS_A_Duration(s),LOS_B_Duration(s),LOS_C_Duration(s),LOS_D_Duration(s),LOS_E_Duration(s),LOS_F_Duration(s)
2177,DefaultProfile,DarkGreen_LowPoly,08:00:00,08:00:53,East12SubwayportalActor,EWConcourseportalActor,1.39653,60.2243,5.4,52.8,26.4,23,3.4,0,0,0

我需要按第4列(In_time)通过增加时间(08:00:00,08:00:01)和第6列(In_Location)按字母顺序(例如东,北等)排序。

到目前为止我的代码看起来像这样:
List<string> list = new List<string>();
using (StreamReader reader = new StreamReader("JourneyTimes.csv"))
{
    string line;
    while ((line = reader.ReadLine()) != null)
    {
        line.Split(',');
        list.Add(line);
    }

我在。csv中读取并使用逗号分割它(没有其他逗号,所以这不是一个问题)。然后将每一行添加到一个列表中。我的问题是如何根据两个参数和.csv的标题对列表进行排序。

我一整天都在看这个,我对编程比较陌生,这是我的第一个程序,所以我很抱歉我的知识不足。

列表按多个参数排序

您可以使用LINQ OrderBy/ThenBy:

listOfObjects.OrderBy (c => c.LastName).ThenBy (c => c.FirstName)

但是首先,您应该将CSV线映射到某个对象。要将CSV行映射到对象,您可以预定义一些类型或动态创建它

from line in File.ReadLines(fileName).Skip(1) //header
let columns = line.Split(',') //really basic CSV parsing, consider removing empty entries and supporting quotes
select new
{
  AgentID = columns[0],
  Profile = int.Parse(columns[1]),
  Avatar = float.Parse(columns[2])
  //other properties
}

请注意,像许多其他LINQ方法一样,这两个方法使用延迟执行

你正在处理两个截然不同的问题。

首先,c#中的两列排序可以通过OrderBy, ThenBy

来实现
public class SpreadsheetExample
{
    public DateTime InTime { get; set; }
    public string InLocation { get; set; }
    public SpreadsheetExample(DateTime inTime, string inLocation)
    {
        InTime = inTime;
        InLocation = inLocation;
    }
    public static List<SpreadsheetExample> LoadMockData()
    {
        int maxMock = 10;
        Random random = new Random();
        var result = new List<SpreadsheetExample>();
        for (int mockCount = 0; mockCount < maxMock; mockCount++)
        {
            var genNumber = random.Next(1, maxMock);
            var genDate = DateTime.Now.AddDays(genNumber);
            result.Add(new SpreadsheetExample(genDate, "Location" + mockCount));
        }
        return result;
    }
}
internal class Class1
{
    private static void Main()
    {
        var mockData = SpreadsheetExample.LoadMockData();
        var orderedResult = mockData.OrderBy(m => m.InTime).ThenBy(m => m.InLocation);//Order, ThenBy can be used to perform ordering of two columns
        foreach (var item in orderedResult)
        {
            Console.WriteLine("{0} : {1}", item.InTime, item.InLocation);
        }
    }
}

现在您可以处理第二个问题,即将数据从Excel移到类中。VSTO就是你要找的。网上有很多这样的例子。遵循我上面发布的例子。将您的自定义类替换为SpreadSheetExample

您可以使用DataTable:

var lines = File.ReadAllLines("test.csv");
DataTable dt = new DataTable();
var columNames = lines[0].Split(new char[] { ',' });
for (int i = 0; i < columNames.Length; i++)
{
    dt.Columns.Add(columNames[i]);
}
for (int i = 1; i < lines.Length; i++)
{
    dt.Rows.Add(lines[i].Split(new char[] { ',' }));
}
var rows = dt.Rows.Cast<DataRow>();
var result = rows.OrderBy(i => i["In_time"])
    .ThenBy(i => i["In_Location"]);
// sum
var sum = rows.Sum(i => Int32.Parse(i["AgentID"].ToString()));