用于更改 LINQ 的函数

本文关键字:函数 LINQ 用于 | 更新日期: 2023-09-27 18:30:50

>我有一个嵌套列表

List<Employee> emplist = new List<Employee>()
{
    new Employee{Age=15, name = "Tom", Projects = new List<project>
    {
        new project { ID = 12, code = 22 ,name = "Project A"},
        new project { ID = 11, code = 23 ,name = "Project B"},
        new project { ID = 16, code = 25 ,name = "Project C"}
    }},
    new Employee{Age=17, name = "Billy", Projects = new List<project>
    {
        new project { ID = 17, code = 20 ,name = "Project D"},
        new project { ID = 18, code = 12 ,name = "Project E"},
        new project { ID = 10, code = 9 ,name = "Project F"}
    }},
    new Employee{Age=25, name = "Sam", Projects = new List<project>
    {
        new project { ID = 22, code = 2 ,name = "Project X"},
        new project { ID = 24, code = 5 ,name = "Project Y"},
        new project { ID = 19, code = 1 ,name = "Project Z"}
    }}
};

这是一个 LINQ,用于搜索 ID(=24) 的最大值并获取索引 (=2) 和子索引 (=1)

var result =  emplist.Select((x,i) => new { index = i, item = x})
                 .SelectMany(x => x.item.project.Select(
                      (a,i) => new { index = x.index, subindex = i, id = a.ID}))
                 .OrderByDescending(x => x.id )
                 .First();

我需要多次为不同的变量执行这个特定的 LINQ(假设这次我想找到最大代码而不是 ID)。是否可以拥有这样的函数,以便我可以快速更改 LINQ?下面的功能是胡说八道,我只是想说明这个想法

public void QuickLINQ(string Parameter1, string Parameter2)
{
var result =  emplist.Select((x,i) => new { index = i, item = x})
                 .SelectMany(x => x.item.Parameter1.Select(
                      (a,i) => new { index = x.index, subindex = i, id = a.Parameter2}))
                 .OrderByDescending(x => x.id )
                 .First();
}

用于更改 LINQ 的函数

我知道这看起来甚至不像 LINQ 表达式那样性感,但它更有效。

此版本将允许您指定用于选择相应项目的条件:

// selector is a function that compares two projects and returns true if we should keep the new one
static void GetIndexes(List<Employee> emplist, out int index, out int subindex, Func<project, project, bool> selector) {
    index = -1;
    subindex = -1;
    project selected = null;
    for (int i = 0; i < emplist.Count; i++) {
        var emp = emplist[i];
        for (int j = 0; j < emp.Projects.Count; j++) {
            var prj = emp.Projects[j];
            if (selected == null || selector(selected, prj)) {
                selected = prj;
                index = i;
                subindex = j;
            }
        }
    }
}

然后你这样称呼它:

int index = 0;
int subindex = 0;
// select by max ID
GetIndexes(emplist, out index, out subindex, (oldPrj, newPrj) => newPrj.ID > oldPrj.ID );
// select by minimum Code
GetIndexes(emplist, out index, out subindex, (oldPrj, newPrj) => newPrj.Code < oldPrj.Code);

注意:我修改了代码以使其成为函数,希望我理解您的意思......

这个怎么样:

var maxEmployee=emplist.OrderByDecending(p=>p.projects.Max(k=>k.ID))
               .FirstOrDefault();

最大员工将具有最高的项目 ID。

我不能完全理解你的问题。 但我想你要求这种事情.....如果您有任何问题,请评论我...因为我没有执行它。只要得到一个想法。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace example
{
[Serializable]
class Project
{
    public int ID { get; set; }
    public string name { get; set; }
}
[Serializable]
class Employee
{
    public int Age{get;set;}
    public string name{get;set;}
    public List<Project> projects { get; set; }
}
public class mainClass
{
    List<Employee> emplist = new List<Employee>();
    List<Project> prjlist = new List<Project>();
    public mainClass()
    {
        prjlist.Add(new Project{ID = 12, name = "Project A"});
        prjlist.Add(new Project{ID = 11, name = "Project B"});
        prjlist.Add(new Project{ID = 16, name = "Project C"});
        emplist.Add(new Employee{Age=15, name = "Tom",projects=prjlist});
        prjlist=null;
        prjlist.Add(new Project{ID = 17, name = "Project D"});
        prjlist.Add(new Project{ID = 18, name = "Project E"});
        prjlist.Add(new Project{ID = 10, name = "Project F"});
        emplist.Add(new Employee{Age=17, name = "Billy",projects=prjlist});
        prjlist=null;
        prjlist.Add(new Project{ID = 22, name = "Project X"});
        prjlist.Add(new Project{ID = 24, name = "Project Y"});
        prjlist.Add(new Project{ID = 19, name = "Project Z"});
        emplist.Add(new Employee{Age=25, name = "Sam",projects=prjlist});
    }
    public void showme()
    {
        int i=24;
        var result = from emp in emplist
                     select (emp.projects as List<Project>).Where(obj => obj.ID == i);
    }
}
}