如何创建具有属性列表之一的行列表

时间:2019-04-12 04:54:58

标签: c# linq

我要执行一个困难的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

enter image description here

enter image description here

作为参考,下面是带有一些采样频率的优先级类别:

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;
        }
    }
}

1 个答案:

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

这在很大程度上取决于该库的结构,其随时间的变化;设计决策供您而非我们做出,但这应该可以给您一些想法