Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在嵌套列表中搜索最大值和索引_C# - Fatal编程技术网

C# 在嵌套列表中搜索最大值和索引

C# 在嵌套列表中搜索最大值和索引,c#,C#,我知道我可以通过这种方式从一个简单的列表中获得最大值和索引 List<Employee> emplist = new List<Employee>() { new Employee{Age=15, name = "Tom"}, new Employee{Age=17, name = "Billy"},

我知道我可以通过这种方式从一个简单的列表中获得最大值和索引

List<Employee> emplist = new List<Employee>()
                        {
                         new Employee{Age=15, name = "Tom"},
                         new Employee{Age=17, name = "Billy"},
                         new Employee{Age=25, name = "Sam"}
                        };

int maxvalue = emplist.Select(i => i.Age).Max();
int index = empList.FindIndex(t => t.Age == maxvalue);
最大值为24。
我还想获得两个索引(员工的索引2和项目的索引1)

您可以使用
的重载来选择
哪些项目也会投影索引以创建匿名类型:

var maxItem = emplist
   .Select((emp, index) => new 
    { 
        maxProject = emp.project
            .Select((proj, pIndex) => new{ proj, pIndex })
            .OrderByDescending(x => x.proj.ID)
            .First(),
        emp, index 
    })
    .OrderByDescending(x => x.maxProject.proj.ID)
    .First();
Console.Write("Max-Value:{0} Emp-Index:{1} Project-Index:{2}"
    , maxItem.maxProject.proj.ID
    , maxItem.index 
    , maxItem.maxProject.pIndex);

(免责声明:未测试,假设所有员工都有一个非空的
列表项目

您可以使用
选择
的重载来创建匿名类型:

var maxItem = emplist
   .Select((emp, index) => new 
    { 
        maxProject = emp.project
            .Select((proj, pIndex) => new{ proj, pIndex })
            .OrderByDescending(x => x.proj.ID)
            .First(),
        emp, index 
    })
    .OrderByDescending(x => x.maxProject.proj.ID)
    .First();
Console.Write("Max-Value:{0} Emp-Index:{1} Project-Index:{2}"
    , maxItem.maxProject.proj.ID
    , maxItem.index 
    , maxItem.maxProject.pIndex);

(免责声明:未经测试,假设所有员工都有一个非空的
列表项目

这将在不订购项目列表的情况下执行相同操作:

    var employee    = emplist.Aggregate((e1, e2) => (e1.project.Max(p1 => p1.ID) > e2.project.Max(p2 => p2.ID)) ? e1 : e2);
    var employeeidx = emplist.IndexOf(employee);
    var project     = employee.project.Aggregate((p1, p2) => (p1.ID > p2.ID) ? p1 : p2);
    var projectidx  = employee.project.IndexOf(project);
    var value       = project.ID;

这将在不为项目列表排序的情况下执行相同的操作:

    var employee    = emplist.Aggregate((e1, e2) => (e1.project.Max(p1 => p1.ID) > e2.project.Max(p2 => p2.ID)) ? e1 : e2);
    var employeeidx = emplist.IndexOf(employee);
    var project     = employee.project.Aggregate((p1, p2) => (p1.ID > p2.ID) ? p1 : p2);
    var projectidx  = employee.project.IndexOf(project);
    var value       = project.ID;
试试下面的Linq

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();
  • 第一个索引将在
    结果中。索引
    =2
  • 第二个索引将在
    结果中。子索引
    =1
  • ID将出现在
    结果中。ID
    =24
尝试以下Linq

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();
  • 第一个索引将在
    结果中。索引
    =2
  • 第二个索引将在
    结果中。子索引
    =1
  • ID将出现在
    结果中。ID
    =24

如果您没有得到适合自己的答案,则不应重新发布您的问题的可能副本。相反,编辑你现有的问题,进一步澄清你想要的是什么,以及为什么提供的信息不能解决你的问题。如果您的问题被搁置,在说明搁置的原因后,可以重新打开。@Servy:我不同意。大量编辑旧问题会使现有答案过时。还有评论。对所有参与的人来说,只关闭旧的问题并回答这个问题更简单,也更不容易混淆。@Servy:编辑问题后,这些答案将是对不同问题的错误回答。哦,据我所知,蒂姆的回答是正确的。但是在编辑之后,它仍然是一个不同问题的答案。@IsoletChan:从这次广泛的讨论中你可以看到,即使是长期会员也不总是同意如何解释规则,所以不要担心。只要尽可能地遵守规则就行了。如果你没有得到适合你的答案,你不应该重新发布你的问题。相反,编辑你现有的问题,进一步澄清你想要的是什么,以及为什么提供的信息不能解决你的问题。如果您的问题被搁置,在说明搁置的原因后,可以重新打开。@Servy:我不同意。大量编辑旧问题会使现有答案过时。还有评论。对所有参与的人来说,只关闭旧的问题并回答这个问题更简单,也更不容易混淆。@Servy:编辑问题后,这些答案将是对不同问题的错误回答。哦,据我所知,蒂姆的回答是正确的。但是在编辑之后,它仍然是一个不同问题的答案。@IsoletChan:从这次广泛的讨论中你可以看到,即使是长期会员也不总是同意如何解释规则,所以不要担心。只要尽量遵守规则就行了。