首页 > 解决方案 > 如何使用 LINQ 检索列表中包含多个列表属性的条目?

问题描述

我有一个IJapaneseDictionaryEntry对象列表,如下所述。在 this 内部是IKanji包含对象的Priorites对象。

我有一件相当困难的事情想做,并希望得到任何建议/建议。我想做的是从我创建的列表中检索Priority具有Priority“Frequency1”或“Frequency2”或“Frequency3”的条目的条目。Priorityentries

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

这是列表:

List<IJapaneseDictionaryEntry> entries = dictionary.GetEntries().ToList();

这是我认为可能有助于解释内容的视图:

在此处输入图像描述

我希望这里的信息足够,因为似乎很难解释我需要检索的内容。

标签: c#linq

解决方案


var result = entries.Where(e => e.Kanjis.Any(k => k.Priorities.Contains(Priority.Frequency1) ||
k.Priorities.Contains(Priority.Frequency2) ||
k.Priorities.Contains(Priority.Frequency3)
)).ToList();

考虑到你的两个问题,我会做这样的事情:

[Flags]
public enum Priority
{
     Frequency1 = 1,
     Frequency2 = 2,
     Frequency3 = 4,
     Frequency4 = 8
}

public interface IKanji
{
    string Text { get; }
    IEnumerable<KanjiInformation> Informations { get; }
    Priority Priorities { get; }
}

在上面将每个优先级视为bitint 中的一个,您可以使用按位或 ( |) 添加优先级:

优先级 = Priority.Frequency1 | Priority.Frequency2 // 表示同时拥有两个优先级

要检查它是否具有特定的优先级,请使用按位和 ( &):

if((Priorities & Priority.Frequency1) == Priority.Frequency1
{
     // it contains Priority.Frequency1
}

那么您正在寻找的答案将是:

Priority p = Priority.Frequency1 | Priority.Frequency2 | Priority.Frequency3

var result = entries.Where(e => e.Kanjis.Any(k => k.Priorities & p == p)))
.ToList();

推荐阅读