C# Linq从列表列表中获取特定项

C# Linq从列表列表中获取特定项,c#,linq,C#,Linq,假设我有这样的目标 public class Example { public List<Children> Children {get; set;} } public class Children { public string Id {get; set;} public List<Element> {get; set;} } public class Element { public string Id {get; set;} } 但这似乎

假设我有这样的目标

public class Example
{
   public List<Children> Children {get; set;}
}

public class Children
{
   public string Id {get; set;}
   public List<Element> {get; set;}
}

public class Element
{
  public string Id {get; set;}
}
但这似乎效率很低。 有没有办法正确地做到这一点


谢谢

您的代码未编译并且存在一些错误。您可以使用SelectMany:

带有预填充示例的代码:

Example example = new(){
    Children = new()
};
for(int i=0; i < 10; i++){
    Children c = new(){
        Id = i.ToString(),
        Elements = new()
    };
    example.Children.Add(c);
    for(int j=0; j < 10; j++){
        Element e = new(){
            Id=(10*i+j).ToString()
        };
        c.Elements.Add(e);
    }
}
string MyId="23";
var result1 = example.Children
    .SelectMany(x => x.Elements)
    .FirstOrDefault(x => x.Id == MyId);

您的代码未编译并且存在一些错误。您可以使用SelectMany:

带有预填充示例的代码:

Example example = new(){
    Children = new()
};
for(int i=0; i < 10; i++){
    Children c = new(){
        Id = i.ToString(),
        Elements = new()
    };
    example.Children.Add(c);
    for(int j=0; j < 10; j++){
        Element e = new(){
            Id=(10*i+j).ToString()
        };
        c.Elements.Add(e);
    }
}
string MyId="23";
var result1 = example.Children
    .SelectMany(x => x.Elements)
    .FirstOrDefault(x => x.Id == MyId);

我在写测试用例时被@Magnetron打败了:-这个答案是对他的答案的xUnit测试

using System.Collections.Generic;
using System.Linq;
using Xunit;

namespace XUnitTestProject.StackOverflow
{
    public class ElementsTests
    {
        [Theory]
        [MemberData(nameof(GenerateTestData), "~element3~")]
        public void Test(Example example, string idInTest)
        {
            // we should probably use SingleOrDefault instead of FirstOrDefault
            // when dealing with instance id
            var elementToFind = example.Children
                .SelectMany(children => children.Elements)
                .FirstOrDefault(element => element.Id.Equals(idInTest));

            Assert.NotNull(elementToFind);
            Assert.Equal(idInTest, elementToFind.Id);
        }

        public static TheoryData<Example, string> GenerateTestData(string idInTest) => new()
        {
            {
                new Example()
                {
                    Children = new List<Children>
                    {
                        new()
                        {
                            Id = "~child1~", Elements = new List<Element>
                            {
                                new() {Id = "~element1~"},
                                new() {Id = "~element2~"}
                            }
                        },
                        new()
                        {
                            Id = "~child2~", Elements = new List<Element>
                            {
                                new() {Id = idInTest},
                                new() {Id = "~element4~"}
                            }
                        }
                    }
                },
                idInTest
            }
        };
    }
}

我在写测试用例时被@Magnetron打败了:-这个答案是对他的答案的xUnit测试

using System.Collections.Generic;
using System.Linq;
using Xunit;

namespace XUnitTestProject.StackOverflow
{
    public class ElementsTests
    {
        [Theory]
        [MemberData(nameof(GenerateTestData), "~element3~")]
        public void Test(Example example, string idInTest)
        {
            // we should probably use SingleOrDefault instead of FirstOrDefault
            // when dealing with instance id
            var elementToFind = example.Children
                .SelectMany(children => children.Elements)
                .FirstOrDefault(element => element.Id.Equals(idInTest));

            Assert.NotNull(elementToFind);
            Assert.Equal(idInTest, elementToFind.Id);
        }

        public static TheoryData<Example, string> GenerateTestData(string idInTest) => new()
        {
            {
                new Example()
                {
                    Children = new List<Children>
                    {
                        new()
                        {
                            Id = "~child1~", Elements = new List<Element>
                            {
                                new() {Id = "~element1~"},
                                new() {Id = "~element2~"}
                            }
                        },
                        new()
                        {
                            Id = "~child2~", Elements = new List<Element>
                            {
                                new() {Id = idInTest},
                                new() {Id = "~element4~"}
                            }
                        }
                    }
                },
                idInTest
            }
        };
    }
}