C# 返回在列表属性中具有值的对象

C# 返回在列表属性中具有值的对象,c#,asp.net-mvc,linq,C#,Asp.net Mvc,Linq,我有一个对象(object1),其中包含其他对象的列表(list)。 如何检查列表是否包含特定对象(Object2),如果包含,如何返回第一个对象(object1) 一些代码需要澄清 域类: public class Parent { public int ParentId { get; set; } public virtual IList<Kid> Kids { get; set; } //This is the list //Unimportant

我有一个对象(object1),其中包含其他对象的列表(list)。 如何检查列表是否包含特定对象(Object2),如果包含,如何返回第一个对象(object1)

一些代码需要澄清

域类:

public class Parent
{
    public int ParentId { get; set; }
    public virtual IList<Kid> Kids { get; set; } //This is the list 

    //Unimportant code
    public virtual IEnumerable<Adres> Adressen
    { get; set; }

    public virtual IEnumerable<string> Emails { get; set; }

    public virtual IEnumerable<string> Telefoonnummers { get; set; }

    public Ouder()
    {
        Kinderen = new List<Lid>();
        Adressen = new List<Adres>();
    }
}

public Parent FindByKid(int kidId)
{
    Kid kid = kids.FirstOrDefault(l => l.KidId == kidId);
    foreach(Parent parent in parents)
    {
        foreach(Kid kid in parent.Kids)
        {
            if(kid.KidId == kidId)
            {
                return parent;
            }
        }
    }
    return null;
}
公共类父类
{
public int ParentId{get;set;}
公共虚拟IList子对象{get;set;}//这是列表
//不重要代码
公共虚拟可数地址
{get;set;}
公共虚拟IEnumerable电子邮件{get;set;}
公共虚拟IEnumerable Telefoonnummers{get;set;}
公共图书馆
{
Kinderen=新列表();
Adressen=新列表();
}
}
公共父FindByKid(int kidId)
{
Kid=kids.FirstOrDefault(l=>l.KidId==KidId);
foreach(父对象中的父对象)
{
foreach(父母中的孩子。孩子)
{
如果(kid.KidId==KidId)
{
返回父母;
}
}
}
返回null;
}

正如你所看到的,我已经想出了一个办法。但我认为必须有一种更好的方法来做到这一点。我尝试使用Linq,但无法提供有效的解决方案。

以下是如何使用Linq:

parents.FirstOrDefault(p => p.Kids.Any(k => k.KidId == kidId));
“给我第一个拥有给定ID的孩子的父母”


我还想指出,您的第一个查询(
Kid-Kid=…
)是不必要的,因为您不使用结果。

以下是如何使用Linq:

parents.FirstOrDefault(p => p.Kids.Any(k => k.KidId == kidId));
“给我第一个拥有给定ID的孩子的父母”


我还想指出,您的第一个查询(
Kid Kid=…
)是不必要的,因为您不使用结果。

您可以使用SelectMany展平IEnumerable中的IEnumerable:

   public Parent FindByKid(int kidId)
    {
        var kid = parents.SelectMany(p => p.Kids).FirstOrDefault(k => K.KidId == kidId);

        return kid == null ? null: kid.Parent;

    }

我正在打电话,因此对于输入错误或格式问题,我深表歉意。

您可以使用SelectMany展平IEnumerable中的IEnumerable:

   public Parent FindByKid(int kidId)
    {
        var kid = parents.SelectMany(p => p.Kids).FirstOrDefault(k => K.KidId == kidId);

        return kid == null ? null: kid.Parent;

    }

我正在打电话,所以对于打字错误或格式问题,我深表歉意。

为什么你认为有更好的方法来解决这个问题?但是,这应该转到review.stackexchange.com。因为我使用了双循环,而我几乎可以肯定我可以使用LINQ。请注意,LINQ基本上也只是做了一个双循环-所以它不像双嵌套循环总是一件坏事。正如我之前提到过一千次:LINQ不是一个神奇的循环简化器,这只是同一事物的另一种语法。因此,当使用LINQ时,你所做的就是隐藏逻辑的复杂性,这基本上并不总是一件好事。为什么你认为有更好的方法来做到这一点?但是,这应该转到review.stackexchange.com。因为我使用了双循环,而我几乎可以肯定我可以使用LINQ。请注意,LINQ基本上也只是做了一个双循环-所以它不像双嵌套循环总是一件坏事。正如我之前提到过一千次:LINQ不是一个神奇的循环简化器,这只是同一事物的另一种语法。因此,当使用LINQ时,您所做的只是隐藏逻辑的复杂性,这基本上并不总是一件好事。工作起来很有魅力!谢谢!工作得很有魅力!谢谢!