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()
也许这还不能给我模块,我必须查找使用哪个单元?