5

私は子供がいない親と親の子供を数えようとしています。私がこれを書いているとき、私はそれがコードでよりよく説明されていることに気づきます。

これらの例のタイプでは:

public class Customer
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<Order> Orders { get; set; }
}

public class Order
{
    public int Id { get; set; }
    public string Description { get; set; }
}

そしてこのデータ:

var customers = new List<Customer>
{
    new Customer
    {
        Id = 2,
        Name = "Jane Doe"
    },
    new Customer
    {
        Id = 1,
        Name = "John Doe",
        Orders = new List<Order>
        {
            new Order { Id = 342, Description = "Ordered a ball" },
            new Order { Id = 345, Description = "Ordered a bat" }
        }
    }
};

// I'm trying to get a count of customer orders added with customers with no orders
// In the above data, I would expect a count of 3 as detailed below
//
// CId      Name        OId
// ----     --------    ----
//  2       Jane Doe
//  1       John Doe    342
//  1       John Doe    345

int customerAndOrdersCount = {linq call here}; // equals 3

私は3のカウントを取り戻そうとしています。

よろしくお願いします。

-ジェシー・フーレ

後に追加:

私はすべての素晴らしい(そして迅速な)答えに本当に感銘を受けました。いくつかのオプションを探してこの質問に来る他の人のために、ここに以下からのいくつかの実用的な例を含むユニットテストがあります。

[TestMethod]
public void TestSolutions()
{
    var customers = GetCustomers(); // data from above

    var count1 = customers.Select(customer => customer.Orders).Sum(orders => (orders != null) ? orders.Count() : 1);
    var count2 = (from c in customers from o in (c.Orders ?? Enumerable.Empty<Order>() ).DefaultIfEmpty() select c).Count();
    var count3 = customers.Sum(c => c.Orders == null ? 1 : c.Orders.Count());
    var count4 = customers.Sum(c => c.Orders==null ? 1 : Math.Max(1, c.Orders.Count()));


    Assert.AreEqual(3, count1);
    Assert.AreEqual(3, count2);
    Assert.AreEqual(3, count3);
    Assert.AreEqual(3, count4);
}

繰り返しになりますが、皆様のご協力に感謝いたします。

4

6 に答える 6

5

どうですか

int customerAndOrdersCount = customers.Sum(c => c.Orders==null ? 1 : Math.Max(1, c.Orders.Count()));
于 2012-09-06T14:51:49.667 に答える
1

これは、「注文なし」を1としてカウントし、それ以外の場合は注文をカウントする場合に機能します。

int customerOrders = customers.Sum(c => c.Orders == null ? 1 : c.Orders.Count());

ちなみに、質問は非常に模範的です。

于 2012-09-06T15:11:08.020 に答える
1

そのOrderプロパティをnullではなく空のリストで初期化する場合は、次のようにすることができます。

int count =
  (
    from c in customers
    from o in c.Orders.DefaultIfEmpty()
    select c
  ).Count();

初期化されていないプロパティを保持することにした場合は、代わりに次のようにします。

int count =
  (
    from c in customers
    from o in (c.Orders ?? Enumerable.Empty<Order>() ).DefaultIfEmpty()
    select c
  ).Count();
于 2012-09-06T15:02:24.143 に答える
1
customers
    .Select(customer => customer.Order)
    .Sum(orders => (orders != null) ? orders.Count() : 1)
于 2012-09-06T15:04:50.210 に答える
0

あなたはおそらくこのようなものを探しています:

 customers.GroupBy(customer=>customer).  //group by object iyself
        Select(c=>                       //select
                    new  
                    {
                      ID = c.Key.Id,                             
                      Name = c.Key.Name, 
                      Count = (c.Key.Orders!=null)? c.Key.Orders.Count():0
                    }
               );
于 2012-09-06T14:58:06.610 に答える
0
var orderFreeCustomers = customers.Where(c=>c.Orders== null || c.Orders.Any()==false);

var totalOrders = customers.Where (c => c.Orders !=null).
Aggregate (0,(v,e)=>(v+e.Orders.Count)  );

結果は、これら2つの値の合計です

于 2012-09-06T15:09:38.060 に答える