我有 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:当然是个人品味的问题,但我不认为这是不可读的。