【问题标题】:How can I use LINQ to select a property inside of an IEnumerable that's inside another IEnumerable?如何使用 LINQ 选择另一个 IEnumerable 内的 IEnumerable 内的属性?
【发布时间】:2019-04-14 16:15:51
【问题描述】:

我有这个 LINQ 查询,它返回下图中显示的数据:

var result = jmdict
            .Where(x => x.Sequence == 1438690)
            .SelectMany(entry =>
                entry.Senses.Select(s =>
                    (entry.Sequence, s.Glosses.Where(x => x.Language.Code == "eng"))));

有没有人知道如何修改它,以便 item2 只返回 Term 的值(“天气”、“元素”等),而不是它当前返回的 IEnumerator。

1) 我尝试了之前给我的这个建议

var r3 = 
   jmdict.Where(x => x.Sequence == 1438690)
         .SelectMany(entry => entry.Senses.Select(s => s.Glosses.Where(x => x.Language.Code == "eng")
         .Select(y => (entry.Sequence, y => y.Term))));

但这不起作用,并且在最后一个 Select 下有一条错误行给出此错误消息:

GetDetails.cs(155,155):错误 CS0411:方法的类型参数 'Enumerable.Select(IEnumerable, Func)' 不能从用法中推断出来。尝试 明确指定类型参数。 (CS0411) (下载)

public static List<IJapaneseDictionaryEntry> jmdict; 

public class JapaneseDictionaryEntry : IJapaneseDictionaryEntry {
    public int Sequence { get; set; }
    private readonly List<Sense> senses = new List<Sense>();
    public IEnumerable<ISense> Senses => this.senses;
}
public interface ISense {
    IEnumerable<Gloss> Glosses { get; }
}
public class Gloss {
    public string Term { get; }
    public Language Language { get; }
    public Gloss(string term, Language language, string gender)
    {
        this.Term = term;
        this.Language = language;
        this.Gender = gender;
    }
}

【问题讨论】:

  • 是否可以提供json格式的样本数据?
  • 看起来您需要在建议的代码中将.Senses.Select 替换为.Senses.SelectMany。任何时候你都应该使用SelectMany,你需要将一个可枚举的可枚举转换为单个可枚举。

标签: c# linq


【解决方案1】:

最后,这是您更正后的第二个查询

var r3 = jmdict.Where(x => x.Sequence == 1438690)
     .SelectMany(entry => entry.Senses.SelectMany(s => s.Glosses.Where(x => x.Language.Code == "eng")
     .Select(y => (entry.Sequence, y => y.Term))));

我已经采用了您的架构并进行了一些修改,这里将是

{Sequence= ?, Term=?}

data.Where(a=>a.Sequence==2)
                       .SelectMany(b=>b.Senses.SelectMany(x=>x.Glosses.Where(g => g.Language == "German"))
                       .Select(y => new {b.Sequence,  y.Term}));

public class JapaneseDictionaryEntry
{
    private List<Sense> senses = new List<Sense>();
    public int Sequence { get; set; }

    public List<Sense> Senses { get { return senses; } set { senses = value; } }
}
public class Sense
{
    private List<Gloss> glosses = new List<Gloss>();

    public List<Gloss> Glosses { get { return glosses; } set { glosses = value; } }
}
public class Gloss
{
    public string Term { get; set; }
    public string Language { get; set; }

}
class Program
{
    static List<JapaneseDictionaryEntry> GetData()
    {
        return new List<JapaneseDictionaryEntry>() {
                    new JapaneseDictionaryEntry()
                    {
                        Sequence = 1,
                        Senses = new List<Sense>() { new Sense() { Glosses = new List<Gloss>() {
                            new Gloss() { Term = "1",Language="English"},
                            new Gloss() { Term = "2",Language="German" },
                            new Gloss() { Term = "3",Language="German" },
                            new Gloss() { Term = "4",Language="English" }
                        }
                        } }
                    },
                    new JapaneseDictionaryEntry()
                    {
                        Sequence = 2,
                        Senses = new List<Sense>() { new Sense() { Glosses = new List<Gloss>() {
                            new Gloss() { Term = "a", Language="English"},
                            new Gloss() { Term = "b", Language="German" },
                            new Gloss() { Term = "c", Language="German" },
                            new Gloss() { Term = "d", Language="English"}
                        }
                        } }
                    }
                };
    }

    static void Main(string[] args)
    {
        var data = GetData();
        var termData = data.Where(a=>a.Sequence==2)
                           .SelectMany(b=>b.Senses.SelectMany(x=>x.Glosses.Where(g => g.Language == "German"))
                           .Select(y => new {b.Sequence,  y.Term}));

        foreach (var item in termData)
        {
            Console.WriteLine(item);
        }

    }}

【讨论】:

    猜你喜欢
    • 2011-06-18
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多