c# - 如何使用 LINQ 检索列表中包含多个列表属性的条目?
问题描述
我有一个IJapaneseDictionaryEntry
对象列表,如下所述。在 this 内部是IKanji
包含对象的Priorites
对象。
我有一件相当困难的事情想做,并希望得到任何建议/建议。我想做的是从我创建的列表中检索Priority
具有Priority
“Frequency1”或“Frequency2”或“Frequency3”的条目的条目。Priority
entries
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();
这是我认为可能有助于解释内容的视图:
我希望这里的信息足够,因为似乎很难解释我需要检索的内容。
解决方案
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; }
}
在上面将每个优先级视为bit
int 中的一个,您可以使用按位或 ( |
) 添加优先级:
优先级 = 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();