使用linq加入和减去2个列表中的值

时间:2014-04-01 17:27:40

标签: c# linq

我有2个lists,其对象为{ DT (date), Value (double) }

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

我知道我可以自己遍历1个列表并在另一个列表中搜索该日期,但如果我能在1个linq行中完成所有这一切,那么它看起来就更清晰了。

2 个答案:

答案 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:肯定是个人品味的问题,但我不认为这是不可读的。