c#如何将两个列表排序为一个

本文关键字:排序 一个 列表 两个 | 更新日期: 2023-09-27 18:17:36

我有一个struct:

struct Employee
{
    public int id;
    public string name;
    public string pw;
    public bool leader;
}

然后我从文本文件中读取数据。

List<Employee> employees = new List<Employee>();
            using (StreamReader sr = new StreamReader("employees.txt"))
            {
                while ((line = sr.ReadLine()) != null)
                {
                    var temp = line.Split(':');
                    Employee employee = new Employee();
                    employee.id = Convert.ToInt32(temp[0]);
                    employee.name = temp[1];
                    employee.pw = temp[2];
                    if (Convert.ToInt32(temp[3]) == 0)
                    {
                        employee.leader = false;
                    }
                    else
                    {
                        employee.leader = true;
                    }
                    employees.Add(employee);
List<int> projectsnumber = new List<int>();

如果他们在一个项目中工作,我添加到projectnumber[employeeid]++;(我也是从一个文本文件中读到的)。如果我在结构体中创建projectsnumber,我就不能修改它的值。问题就在这里。我必须显示员工的名字,这取决于他们参与了多少项目。我可以按降序对projectnumber进行排序,但是我不能显示它们的名称。如果我在projectsnumber中查找排序数字的索引,那么如果有2个相同的数字,它将只显示其中的一个员工,两次。所以如果我有一个有数字和名字的列表,我可以把它们都写出来。我怎么能做到呢?

c#如何将两个列表排序为一个

按项目数量对员工进行排序,并选择他们的姓名。使用LINQ:

很容易做到这一点
var names = employees.OrderByDescending(e => projectsnumber[e.id]).Select(e => e.name);

查询语法:

var names = from e in employees
            orderby projectsnumber[e.id] descending
            select e.name;

如果您需要姓名和项目数,那么您可以将员工投影为匿名类型:

var query = from e in employees
            let projectsCount = projectsnumber[e.id]
            orderby projectsCount descending
            select new {
               ProjectsCount = projectsCount,
               Name = e.name
            };

注意:正如@crashmstr指出的那样,最好使用类而不是结构体。在c#中,我们使用Pascal Case表示类/结构属性和方法名。