如何使用LINQ在同一级别选择属性以及列表的其他项?

时间:2019-04-05 08:04:59

标签: c# 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; }
}

我通过此查询选择了数据:

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

我知道如何进行这样的简单查询:

var a = entries.SelectMany(x => x.Kanjis);

以及如何仅选择文本:

var a = entries.SelectMany(x => x.Kanjis).Select(x => x.Text);

但是我想看到的是案文和优先事项,我不确定该怎么做。我想做的就是得到一个像这样的平面输出:

kanji1  ichimango1  Newspaper1  frequency10

如何通过选择来选择,排序和整理优先级?

类似这样的东西:

var a = entries.SelectMany(x => x.Kanjis)
               .Select(x => x.Text, Priorities1, Priorities2, Priorities3);

请注意,优先级1,优先级2或优先级3可能没有任何条目

enter image description here

1 个答案:

答案 0 :(得分:4)

您需要使用要返回的属性创建一个匿名对象:

// Where Context property returns a singleton instance of MyDbContext
var db = MyDbContextFactory.Context;
var data = new MyData { Timestamp = DateTime.UtcNow, Data = "123" };
db.MyData.Add(data);
db.SaveChanges();

根据您的编辑:如果您只想获得完全具有var a = entries.SelectMany(x => x.Kanjis) .Select(x => new { x.Text, x.Priorities }); 的{​​{1}},则需要在Kanjis之后添加Priority:< / p>

Where

但是,我建议在Select上调用var a = entries.SelectMany(x => x.Kanjis) .Select(x => new { x.Text, x.Priorities }) .Where(x => x.Priorities.Any()); ,以避免仅对确定是否有任何元素进行两次迭代相同的集合。从技术上讲,您可以ToList前面也使用x.Priorities,但是在这种情况下,您将失去调用Where的能力,从而避免了多次迭代