所以,我有一个结构:
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中查找已排序数字的索引,那么如果有2个相同的数字,它将仅显示在雇员上,两次。所以如果我有一个包含数字和名字的列表,我可以写两个。我怎么能这样做?
答案 0 :(得分:0)
只需按项目数量订购员工并选择他们的名字。使用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用于类/结构属性和方法名称。