Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.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#_Linq - Fatal编程技术网

C# 同时查找和映射

C# 同时查找和映射,c#,linq,C#,Linq,我有一个数据结构,其中模块包含单元,单元包含节,从模块列表中,我想找到第一个模块,其中至少包含一个单元,其中至少包含一个节,我想对模块、单元和节进行一些操作 我最初尝试使用modules.Find(),但它只告诉我第一个非空模块是什么,因此我必须查找该单元两次: var module = modules.Find(m => m.Units.Exists(u => u.Sections.Count > 0)); if (module == null) { throw new

我有一个数据结构,其中模块包含单元,单元包含节,从模块列表中,我想找到第一个模块,其中至少包含一个单元,其中至少包含一个节,我想对模块、单元和节进行一些操作

我最初尝试使用
modules.Find()
,但它只告诉我第一个非空模块是什么,因此我必须查找该单元两次:

var module = modules.Find(m => m.Units.Exists(u => u.Sections.Count > 0));
if (module == null)
{
  throw new Exception("there are no non-empty modules");
}
var unit = module.Units.Find(u => u.Sections.Count > 0);
var section = unit.Sections.First();
doSomeStuff(module, unit, section);
我最终编写了自己的函数来实现这一点:

private Tuple<Module, Unit, Section> getFirstModuleWithVisibleSection(List<Module> modules)
{
    foreach (var module in modules)
    {
        foreach (var unit in module.Units)
        {
            var section = unit.Sections.FirstOrDefault();
            if (section != null)
            {
                return new Tuple<Module, Unit, Section>(module, unit, section);
            }
        }
    }
    return null;
}

...

var res = getFirstModuleWithVisibleSection(modules);
if (res == null)
{
    throw new Exception("no visible modules");
}
var module = res.Item1;
var unit = res.Item2;
var section = res.Item3;
doSomething(module, unit, section);

有没有办法在C#中做到这一点?

当然不优雅,但它可能满足需要

public Module FirstModuleWithAUnitWithASection(IEnumerable<Module> modules)
    => modules.Where(module => module.Units != null)
    .Select(module => module.Units.Where(unit => unit.Sections != null)
    .Select(unit => unit.Sections.Select(section => module)
    .First()).First()).First();
public Module firstmodulewithUnitwitha操作(IEnumerable modules)
=>modules.Where(module=>module.Units!=null)
.Select(module=>module.Units.Where(unit=>unit.Sections!=null)
.Select(unit=>unit.Sections.Select(section=>module)
.First()).First()).First();

当然不优雅,但它可能满足需要

public Module FirstModuleWithAUnitWithASection(IEnumerable<Module> modules)
    => modules.Where(module => module.Units != null)
    .Select(module => module.Units.Where(unit => unit.Sections != null)
    .Select(unit => unit.Sections.Select(section => module)
    .First()).First()).First();
public Module firstmodulewithUnitwitha操作(IEnumerable modules)
=>modules.Where(module=>module.Units!=null)
.Select(module=>module.Units.Where(unit=>unit.Sections!=null)
.Select(unit=>unit.Sections.Select(section=>module)
.First()).First()).First();
关于:

var query = from m in modules
            from u in m.Units
            let s = u.Sections.FirstOrDefault()
            where s != null
            select new
            {
                m,
                u,
                s
            };
var item = query.FirstOrDefault();
那么:

var query = from m in modules
            from u in m.Units
            let s = u.Sections.FirstOrDefault()
            where s != null
            select new
            {
                m,
                u,
                s
            };
var item = query.FirstOrDefault();

.Where(x!=null&&x='what your seeking').FirstOrDefault()
也许这还不能给我模块,我必须查找使用哪个单元?
.Where(x!=null&&x='what your seeking')。FirstOrDefault()
也许这还不能给我模块,我必须查找使用哪个单元?