在LINQ中,如何选择列表的FirstOrDefault?

时间:2019-04-12 06:21:14

标签: c# linq

我有这些对象:

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)(下载)

有人可以给我建议我在这里做错什么吗

1 个答案:

答案 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);