1

親リストと2つの子リストを1つのリストにフラット化する必要があります。c#とlinqを使用してこれを行うにはどうすればよいですか?

これが私のコードです...

public class Customer
{
    public string FirstName { get; set;}
    public string LastName { get; set;}
    // need to flatten these lists
    public List<CreditCard> CreditCards { get; set;}
    public List<Address> Addresses{ get; set;}
}

//  Customer has CreditCards list and Addresses list
List<Customer> allCustomers = _db.GetAllCustomers();

// how to flatten Customer, CreditCards list, and Addresses list into one flattened record/list?

var result = allCustomers.GroupBy().SelectMany(); // how to flatten nested lists?

したがって、結果リストには、次のようにフラット化されたように見えるアイテムが含まれます。

Joe、Blow、Visa、Master Card、38 Oak Street、432 Main Avenue

サリー、カップケーキ、ディスカバー、マスターカード、29メープルグローブ、887ナットストリート

これにより、顧客のFirstName、LastName、CreditCardsリスト、およびAddressesリストがフラット化されます。

フィードバックをありがとう!

4

5 に答える 5

4

実装IEnumerable

public class Customer : IEnumerable<string>
{
    public string FirstName {get; set;}
    public string LastName {get; set;}
    public List<CreditCard> CreditCards {get; set;}
    public List<Address> Addresses{get; set;}

    public IEnumerator<string> GetEnumerator()
    {
        yield return FirstName;
        yield return LastName;
        foreach (CreditCard c in CreditCards)
        {
            yield return c.ToString();
        }
        foreach (Address a in Addresses)
        {
            yield return a.ToString();
        }
    }
}

...

var result = allCustomers.SelectMany(c => c);

注:これは単なる例です。

于 2012-08-24T16:11:42.093 に答える
1

すべてを1つのリストにまとめる場合は、SelectManyを使用します。この場合、顧客ごとのレコードが必要なので、フラット化する必要はありません。

あなたの例のような配列の場合、次のようなものが機能するはずです。

var result = customers
   .Select(customer => new[]
   {
      customer.FirstName,
      customer.LastName
   }
   .Concat(customer.CreditCards.Select(cc => cc.ToString()))
   .Concat(customer.Addresses.Select(address => address.ToString())));
于 2012-08-24T16:12:53.753 に答える
0

各タイプをにキャストしてからobject、を使用Unionしてフラットにします。

        var allCreditCards = from customer in allCustomers
                             from creditCard in customer.CreditCards
                             select (object)creditCard;

        var allAddresses = from customer in allCustomers
                           from address in customer.Addresses
                           select (object)address;

        var flat = allCustomers.Concat(allCreditCards).Concat(allAddresses);

アイテムがすべて異なるタイプである場合にフラット化することの価値は正確にはIEnumerable<object>わかりませんが、それはあなたがそれを行う方法です。

于 2012-08-24T16:09:59.760 に答える
0

string.Joinに依存するため、これはオブジェクトにlinqを使用します。

allCustomers.Select(c=>
  new { FirstName = c.FirstName, LastName= c.LastName,
     CardsList = string.Join(",", c.CreditsCards.Select(c=> c.CardName))
     AddressesList = string.Join(",", c.Addresses.Select(c=> c.Street)
  }
)
于 2012-08-24T16:13:45.417 に答える
0

あなたの編集に基づいて、これはIEnumerable<string>あなたが望むようにあなたに与えるでしょう:

var flatenned = from c in allCustomers
                select
                    c.FirstName + ", " +
                    c.LastName + ", " +
                    String.Join(", ", c.CreditCards.Select(c2 => c2.Name).ToArray()) + ", " +
                    String.Join(", ", c.Addresses.Select(a => a.Street).ToArray());

出力:

Joe、Blow、Visa、Master Card、38 Oak Street、432 Main Avenue

サリー、カップケーキ、ディスカバー、マスターカード、29メープルグローブ、887ナットストリート

完全なテストコード:

システムを使用する; System.Collections.Genericを使用します。System.Linqを使用します。System.Textを使用します。

名前空間Console40{クラスLinqFlatten{

    public class Customer
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        // need to flatten these lists
        public List<CreditCard> CreditCards { get; set; }
        public List<Address> Addresses { get; set; }
    }

    public class CreditCard
    {
        public string Name { get; set; }
    }

    public class Address
    {
        public string Street { get; set; }
    }

    public static void Test()
    {
        //  Customer has CreditCards list and Addresses list
        List<Customer> allCustomers = GetAllCustomers();

        // how to flatten Customer, CreditCards list, and Addresses list into one flattened record/list?

        var flatenned = from c in allCustomers
                        select
                            c.FirstName + ", " +
                            c.LastName + ", " +
                            String.Join(", ", c.CreditCards.Select(c2 => c2.Name).ToArray()) + ", " +
                            String.Join(", ", c.Addresses.Select(a => a.Street).ToArray());

        flatenned.ToList().ForEach(Console.WriteLine);
    }

    private static List<Customer> GetAllCustomers()
    {
        return new List<Customer>
                   {
                       new Customer
                           {
                               FirstName = "Joe",
                               LastName = "Blow",
                               CreditCards = new List<CreditCard>
                                                 {
                                                     new CreditCard
                                                         {
                                                             Name = "Visa"
                                                         },
                                                     new CreditCard
                                                         {
                                                             Name = "Master Card"
                                                         }
                                                 },
                               Addresses = new List<Address>
                                               {
                                                   new Address
                                                       {
                                                           Street = "38 Oak Street"
                                                       },
                                                   new Address
                                                       {
                                                           Street = "432 Main Avenue"
                                                       }
                                               }
                           },
                       new Customer
                           {
                               FirstName = "Sally",
                               LastName = "Cupcake",
                               CreditCards = new List<CreditCard>
                                                 {
                                                     new CreditCard
                                                         {
                                                             Name = "Discover"
                                                         },
                                                     new CreditCard
                                                         {
                                                             Name = "Master Card"
                                                         }
                                                 },
                               Addresses = new List<Address>
                                               {
                                                   new Address
                                                       {
                                                           Street = "29 Maple Grove"
                                                       },
                                                   new Address
                                                       {
                                                           Street = "887 Nut Street"
                                                       }
                                               }
                           }
                   };
    }
}

}

于 2012-08-24T16:30:37.287 に答える