Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用linq从2个列表中联接和减去值_C#_Linq - Fatal编程技术网

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)
                  };