我有这些对象:
public interface IJapaneseDictionaryEntry
{
int Sequence { get; }
IEnumerable<IKanji> Kanjis { get; }
IEnumerable<IReading> Readings { get; }
IEnumerable<ISense> Senses { get; }
}
public interface IKanji
{
string Text { get; }
IEnumerable<KanjiInformation> Informations { get; }
IEnumerable<Priority> Priorities { get; }
}
和LINQ查询:
var d = entries.SelectMany(x => x.Kanjis)
.Where(x => x.Priorities.Any(pri => pri.Code.StartsWith("nf")))
.Select(x => new { x.Text, x.Priorities });
我想做的是选择第一个条目,所以我这样做了:
var d = entries.SelectMany(x => x.Kanjis)
.Where(x => x.Priorities.Any(pri => pri.Code.StartsWith("nf")))
.Select(x => new { x.Text, x.Priorities.StartsWith("nf").FirstOrDefault().Code });
但这给我一个错误:
.Select(x => new { x.Text, x.Priorities.StartsWith("nf").FirstOrDefault().Code });
说:
ApplyFrequency.cs(56,56):错误CS1061:“ IEnumerable”确实 不包含“ StartsWith”的定义,没有扩展方法 'StartsWith'接受类型的第一个参数 可以找到“ IEnumerable”(您是否缺少使用 指令还是程序集引用?)(CS1061)(下载)
有人可以给我建议我在这里做错什么吗
答案 0 :(得分:5)
只需将StartsWith
放在FirstOrDefault
内:
var d = entries.SelectMany(x => x.Kanjis)
.Where(x => x.Priorities.Any(pri => pri.Code.StartsWith("nf")))
.Select(x => new {
x.Text,
x.Priorities.FirstOrDefault(p => p.Code.StartsWith("nf"))?.Code
});
您也可以不使用?.
运算符,因为只过滤那些优先级与条件匹配的那些运算符。
另一种写法是:
var d = entries.SelectMany(x => x.Kanjis.Select(x => new {
x.Text,
x.Priorities.FirstOrDefault(p => p.Code.StartsWith("nf"))?.Code
}).Where(x => x.Code != null);