我要执行一个困难的LINQ查询。这是我所拥有的:
IJapaneseDictionaryEntry
对象的列表,如下所述。其中是IKanji
个对象。
public interface IJapaneseDictionaryEntry
{
int Sequence { get; }
IEnumerable<IKanji> Kanjis { get; }
IEnumerable<IReading> Readings { get; }
IEnumerable<ISense> Senses { get; }
}
每个对象都包含IKanji
个对象的列表
public interface IKanji
{
string Text { get; }
IEnumerable<KanjiInformation> Informations { get; }
IEnumerable<Priority> Priorities { get; }
}
我正在使用此查询:
var b = entries.SelectMany(x => x.Kanjis)
.Where(x => x.Priorities.Any())
.Select(x => new { x.Text, x.Priorities });
但不是.Any(),我要选择的那些行一直包含Frequency1或Frequency2或Frequency3属性,一直到Frequency24为止。
有没有办法做到这一点,并将.any替换为将表示Frequency1,频率2,频率3 ...频率24中的任何一个的结构
我添加了一个图像来显示优先级。代码值从nf1到nf24
作为参考,下面是带有一些采样频率的优先级类别:
namespace Wacton.Desu
{
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using Wacton.Tovarisch.Enum;
public class Priority : Enumeration
{
public static readonly Priority Newspaper1 = new Priority("Newspaper1", "news1");
public static readonly Priority Newspaper2 = new Priority("Newspaper2", "news2");
public static readonly Priority Frequency1 = new Priority("Frequency1", "nf01");
public static readonly Priority Frequency2 = new Priority("Frequency2", "nf02");
public static readonly Priority Frequency3 = new Priority("Frequency3", "nf03");
public static readonly Priority Frequency4 = new Priority("Frequency4", "nf04");
public static readonly Priority Frequency5 = new Priority("Frequency5", "nf05");
public string Code { get; }
private static int counter;
public Priority(string displayName, string code)
: base(counter++, displayName)
{
this.Code = code;
}
}
}
答案 0 :(得分:2)
我从发布的其他片段中假设,每个优先级都有一个代码,而每个频率优先级都有一个类似“ nf ...”的代码,因此您可以在Any中放置一个布尔测试:
...Priorities.Any(pri => pri.Code.StartsWith("nf"))
如果频率高于24,而您想排除它们,则可能需要使用布尔测试来变得更可爱。可能足以:
...Priorities.Any(pri => pri.Code.StartsWith("nf") && (pri.Code.Length == 3 || pri.Code <= "nf24"))
这在很大程度上取决于该库的结构,其随时间的变化;设计决策供您而非我们做出,但这应该可以给您一些想法