4

次のオブジェクト構造があります。

public class A
{
    public string ID { get; set; }
    public IList<B> Values { get; set; }
}

public class B
{
    public string Code { get; set; }
    public string DisplayName { get; set; }
}

public List<A> IDs;

Linq を使用して B をクエリし、値に B の 1 つの要素を含む A の 1 つのインスタンスを返します。それは可能ですか?私は現在これを foreach で行っていますが、Linq の方がきれいだと思います。

foreach (A a in IDs)
{
    foreach (B b in a.Values)
    {
        if (b.Code == code)
        {
            return (new A()
            {
                ID = a.ID,
                Values = new List<B>()
                {
                    new B()
                    {
                        Code = b.Code,
                        DisplayName = b.DisplayName
                     }
                 }
            });
        }
    }
}
4

3 に答える 3

6

これを試して:

IDs.Where(a=>a.ID = id)
   .Select(a => new A() 
   {
       ID = a.ID,
       Values = new List<B>()
       {
           new B() 
           { 
               Code = a.Values.First().Code, 
               DisplayName = a.Values.First().DisplayName 
           }
       }
    });
于 2013-07-24T10:34:05.613 に答える
3

query-syntax を使用した LINQ では、次のようになります。

return (from a in IDs
        from b in a.Values
        where b.Code == code
        select (new A
        {
            ID = a.ID, Values = new List<B>
            {
                new B
                {
                    Code = b.Code, 
                    DisplayName = b.DisplayName
                }
            }
        })).FirstOrDefault();
于 2013-07-24T10:47:51.813 に答える
2

LinqPad (LinqPad.com) で次を実行します。

void Main()
{
    List<A> IDs= new List<A>() {
        new A() { ID = "1", Values = new List<B>() {
                             new B { Code = "1", DisplayName = "1"}, 
                             new B { Code = "2", DisplayName = "2"},
                             new B { Code = "3", DisplayName = "3"} } },
        new A() { ID = "4", Values = new List<B>() { 
                             new B { Code = "4", DisplayName = "4"}, 
                             new B { Code = "5", DisplayName = "5"},
                             new B { Code = "6", DisplayName = "6"} } },
        new A() { ID = "7", Values = new List<B>() { 
                             new B { Code = "7", DisplayName = "7"}, 
                             new B { Code = "8", DisplayName = "8"},
                             new B { Code = "9", DisplayName = "9"} } }
    };

    A result = IDs.Where(a => a.Values.Any(b=> b.Code == "4")).FirstOrDefault();
    result.Dump();
    result = IDs.FirstOrDefault(a => a.Values.Any(b=> b.Code == "8"));
    result.Dump();

}

// Define other methods and classes here
public class A
{
    public string ID { get; set; }
    public IList<B> Values { get; set; }
}

public class B
{
    public string Code { get; set; }
    public string DisplayName { get; set; }
}

あなたはこれを得る:

結果


以前の編集は次のとおりです。

質問を編集すると:

A result = IDs.Where(a => a.Values.Any(b=> b.Code == code)).FirstOrDefault();

以下の元の回答

以下は、ID = id である最初の A 要素を返します。

A result = IDs.Where(a => a.ID == id).FirstOrDefault();

これでリストになる

List<A> result = IDs.Where(a => a.ID == id).FirstOrDefault().ToList();
于 2013-07-24T10:32:36.243 に答える