我有2个lists
,其对象为{ DT (date), Value (double) }
。
我想在约会时加入并减去2个值。但是,有时一个列表不会有给定DT的任何记录,在这种情况下,我只想使用列表中的值。但是,因为我正在加入最终发生的事情,所以我根本没有获得DT的记录。有没有办法用linq来表示这个?
我知道我可以自己遍历1个列表并在另一个列表中搜索该日期,但如果我能在1个linq行中完成所有这一切,那么它看起来就更清晰了。
答案 0 :(得分:0)
我相信这就是你能做的:
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();
随意运行我写的测试ConsoleApp:
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; }
}
}
}
答案 1 :(得分:0)
假设您的班级名为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()
方法将联接转换为外部联接,如果任何给定的(x1, null)
没有匹配的x2
,则确保获得DT
的联接对。< / p>
PS:肯定是个人品味的问题,但我不认为这是不可读的。