C# 使用linq从2个列表中联接和减去值
我有两个C# 使用linq从2个列表中联接和减去值,c#,linq,C#,Linq,我有两个列表,它们的对象是{DT(date),Value(double)} 我想在日期加入并减去2个值。然而,有时一个列表不会有给定DT的任何记录,在这种情况下,我只想使用列表中的值。然而,因为我加入了最终发生的事情,我没有得到任何关于DT的记录。是否有任何方法可以使用类似于linq的sql来表示这一点 我知道我可以自己循环一个列表,然后在另一个列表中搜索该日期,但如果我可以在一行中完成所有操作,它看起来就更干净了。我相信这就是你可以做的: var result = (from x in lis
列表
,它们的对象是{DT(date),Value(double)}
我想在日期加入并减去2个值。然而,有时一个列表不会有给定DT的任何记录,在这种情况下,我只想使用列表中的值。然而,因为我加入了最终发生的事情,我没有得到任何关于DT的记录。是否有任何方法可以使用类似于linq的sql来表示这一点
我知道我可以自己循环一个列表,然后在另一个列表中搜索该日期,但如果我可以在一行中完成所有操作,它看起来就更干净了。我相信这就是你可以做的:
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();
请随意运行我编写的测试控制台App:
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; }
}
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
命名空间StackOverFlowConsoleApplication
{
班级计划
{
静态void Main(字符串[]参数)
{
List list1=新列表()
{
新项(){date=DateTime.Today,value=100},
新项(){date=DateTime.Today.AddDays(-1),value=100}
};
List list2=新列表()
{
新项(){date=DateTime.Today,value=50}
};
var result=(从列表1中的x选择新项(){date=x.date,value=x.value-(从列表2中的y开始,其中x.date.Equals(y.date)选择y.value)。FirstOrDefault())。ToList();
}
类项目
{
公共日期时间日期{get;set;}
公共双值{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>();
DefaultIfEmpty()
方法将联接转换为外部联接,确保在任何给定的DT
没有匹配的x2
的情况下获得一对(x1,null)
PS:当然是个人品味的问题,但我不认为这是不可读的。你能发布一些代码吗?你试了什么?你使用的是什么模型?你如何知道从哪个模型中减去哪个值?对它们求和很简单,但是value1-value2可能是与value2-value1不同的结果problem@itsme86根据我创建的列表,我知道该往哪个方向走。就我个人而言,试图将这一逻辑转化为一行对我来说似乎一点都不干净,它可能最终几乎无法阅读——而一些写得很好的代码加上对您正在做的事情的注释会更好。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)
};