使用 linq 联接和减去 2 个列表中的值

  • 本文关键字:列表 linq 使用 c# linq
  • 更新时间 :
  • 英文 :


我有 2 个lists具有 { DT (date), Value (double) } 的对象。

我想在日期加入并减去 2 个值。但是,有时一个列表不会有任何给定 DT 的记录,在这种情况下,我只想使用列表中的值。但是,因为我正在加入最终发生的事情是我根本没有那个 DT 的记录。有没有办法像 linq 一样使用 sql 来表示这一点?

我知道我可以自己遍历 1 个列表并在另一个列表中搜索该日期,但如果我可以在 1 个 linq 行中完成所有操作,它看起来就更干净了。

我相信这是你可以做的:

var result = (from x in list1 select new Item() { date = x.date, value = x.value - (from y in list2 where x.date.Equals(y.date) select y.value).FirstOrDefault() }).ToList();

随意运行我写的测试控制台应用程序:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace StackOverFlowConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Item> list1 = new List<Item>()
            {
                new Item(){date = DateTime.Today, value=100},
                new Item(){date = DateTime.Today.AddDays(-1), value=100}
            };
            List<Item> list2 = new List<Item>()
            {
                new Item(){date = DateTime.Today, value=50}               
            };
            var result = (from x in list1 select new Item() { date = x.date, value = x.value - (from y in list2 where x.date.Equals(y.date) select y.value).FirstOrDefault() }).ToList();
        }
        class Item
        {
            public DateTime date { get; set; }
            public double value { get; set; }
        }

    }
}

假设你的类被命名为Blub,看起来像这样:

public class Blub
{
    public DateTime DT { get; set; }
    public double Value { get; set; }
}

你有两个列表:

var list1 = new List<Blub>();
var list2 = new List<Blub>();

然后,您可以使用此 LINQ 查询查找每个日期的差异:

var differences = from x1 in list1
                  join x2 in list2 on x1.DT equals x2.DT into temp
                  from x2 in temp.DefaultIfEmpty()
                  select new Blub
                  {
                      DT = x1.DT,
                      Value = x1.Value - (x2 != null ? x2.Value : 0.0)
                  };

DefaultIfEmpty() 方法将联接转换为外联接,确保在任何给定DT没有匹配x2时获得联接对(x1, null)

PS:当然是个人品味的问题,但我不认为这是不可读的。

相关内容

  • 没有找到相关文章

最新更新