我试图加入两个对象列表,并更新第一个对象(ProductReport)中的property(Revenue),使其与加入的对象(Transaction)中的property(Revenue)相同。该代码是打击:

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

namespace TestConsole
{
    public class ProductReport
    {
        public string productName { get; set; }
        public int PrdouctID { get; set; }
        public double Revenue { get; set; }
    }

    public class Transaction
    {
        public double Revenue { get; set; }
        public int PrdouctID { get; set; }
    }

    public class Program
    {
        static void Main(string[] args)
        {
            List<ProductReport> products = new List<ProductReport>();
            ProductReport p = new ProductReport();
            p.productName = "Sport Shoe";
            p.PrdouctID = 1;

            products.Add(p);

            List<Transaction> transactions = new List<Transaction>();
            Transaction t1 = new Transaction();
            t1.PrdouctID = 1;
            t1.Revenue = 100.0;

            Transaction t2 = new Transaction();
            t2.PrdouctID = 1;
            t2.Revenue = 200.00;

            transactions.Add(t1);
            transactions.Add(t2);

            var results = (from product in products
                           join transaction in transactions on product.PrdouctID equals transaction.PrdouctID into temp
                           from tran in temp.DefaultIfEmpty()
                           select new { product, tran }
                           ).ToList();

            results.ForEach(x => x.product.Revenue = x.tran.Revenue);
        }

    }
}


该代码根据ProductID连接2个对象列表。我希望在结果对象中看到两个ProductReport项,分别具有100.00和200.00的收入。但是,foreach函数以某种方式覆盖了第一个ProductReport中的Revenue属性。最后,两个ProductReport的收入均为200.00。谁能帮助我,以及如何轻松获得我想要的结果
?谢谢。

最佳答案

foreach函数以某种方式覆盖了第一个ProductReport中的Revenue属性。最后,两个ProductReport的收入均为200.00。


在下面的行中,x.product指的是同一实例。

results.ForEach(x => x.product.Revenue = x.tran.Revenue);


您只有一个ProductReport对象,并且其Revenue属性只能有一个值。该单个实例的Revenue属性不能同时为100.00和200.00。第一次写入时,将其设置为100.00,第二次写入时,将其覆盖为200.00


  我期望在结果对象中看到两个ProductReport项目。


您的代码仅创建一个ProductReport项目。如果要查看其中两个(或多个),则需要创建两个(或多个)对象。以下代码利用Select为您执行此操作。您的ForEach会改变原始对象,而Select和LINQ的其余部分会创建一个新对象,而不会改变原始对象。

var results =
    from product in products
    join transaction in transactions on product.PrdouctID equals transaction.PrdouctID
    select new
    {
        product, transaction
    };

var updated = results.Select(x => {
    x.product.Revenue = x.transaction.Revenue;
    return x.product;
});


这是此输出的as a Fiddle

Sport Shoe 100
Sport Shoe 200

关于c# - C#Linq加入问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49911399/

10-10 12:43