我的对象是“MyClass”,有2个属性:Id(int)和HourBy(int)
我有两个清单:
var List1 = new List<MyClass>();
var List2 = new List<MyClass>();
我想获得一个列表: - 来自List2中的List1中的对象基于Id with Hourby(list2)&lt; List1中的Hourby - List2中的对象在List2中不存在
//#Sample1
//List1 :
List1.add(new MyClass(1,10));
List1.add(new MyClass(2,20));
List1.add(new MyClass(3,30));
//List2 :
List2.add(new MyClass(1,10));
List2.add(new MyClass(2,15));
//I'd like to get :
new MyClass(2,5);
new MyClass(3,30);
//Sample2
List1 :
List1.add(new MyClass(1,10));
List1.add(new MyClass(2,20));
List1.add(new MyClass(3,30));
//List2 :
List2.add(new MyClass(1,10));
List2.add(new MyClass(2,15));
List2.add(new MyClass(2,2));
//I'd like to get :
new MyClass(2,3);
new MyClass(3,30);
谢谢,
答案 0 :(得分:4)
您可以通过以下Linq声明执行此操作:
var result = List1.Where(x => !List2.Select(y => y.Id).Contains(x.Id)
|| List2.Single(y => x.Id == y.Id).HourBy < x.HourBy);
最好的问候
答案 1 :(得分:1)
我认为这是你所追求的,基于你提供的示例列表......
var list3 = new List<MyClass>();
foreach(var item in list1)
{
var totalFromOther = list2.Where(x => x.id == item.id).Sum(y => y.HourBy);
var newItem = new MyClass() { id = item.Id, HourBy = item.HourBy - totalFromOther };
if(newItem.HourBy > 0)
list3.Add(newItem);
}
答案 2 :(得分:1)
这是一个解决方案:
var qry = from ee in
(from e1 in list1
join e2 in list2 on e1.Id equals e2.Id into gj
from e in gj.DefaultIfEmpty()
select new {
e1.Id,
MainHourBy = e1.HourBy,
SecondHourBy = (e == null ? 0 : e.HourBy)
})
where ee.SecondHourBy < ee.MainHourBy
group ee by ee.Id into g
select new MyClass
{
Id = g.Key,
HourBy = g.First().MainHourBy - g.Sum(el => el.SecondHourBy)
};
答案 3 :(得分:1)
我使用这段代码,它并不完美但工作正常,对于Linq的新手来说可能更清楚(像我一样)
List< MyClass> listRes = new List< MyClass>();
foreach ( MyClass item in list1)
{
var exist = list2
.Select(x => x.MyClass)
.Contains(item);
if (!exist)
listRes.Add(item);
else
{
var totalFromOther = list2
.Where(x => x.MyClass.Id == item.Id)
.Sum(y => y.HourBy);
if (item.HourBy != totalFromOther)
{
item.HourBy = item.HourBy - totalFromOther;
listRes.Add(item);
}
}
}
谢谢你的帮助,
答案 4 :(得分:0)
var agg1 = from l in list1
group l by l.ID into g
select new { g.Key, Sum = g.Sum(_ => _.HourBy) };
var agg2 = from l in list2
group l by l.ID into g
select new { g.Key, Sum = g.Sum(_ => _.HourBy) };
var q = from l1 in agg1
let l2 = agg2.FirstOrDefault(_ => _.Key == l1.Key)
let sum = l1.Sum - (l2 != null ? l2.Sum : 0)
where sum != 0
select new MyClass(l1.Key, sum);
var list3 = q.ToList();
答案 5 :(得分:0)
//Group list 2, so there is one entry per ID, with HourBy = total hour by
var summedL2 = from item2 in List2
group item2 by item2.ID into g
select new Test(g.Key, g.Sum(item => item.HourBy));
var result =
//Select items from list1
from item1 in List1
//Left join to our summed List2
join item2s in summedL2 on item1.ID equals item2s.ID into tempItem2s
from item2 in tempItem2s.DefaultIfEmpty()
//Where there is no match, or item2 is < item1
where (item2 == null || item2.HourBy < item1.HourBy)
//Select a new Test object, with the HourBy changed
select new Test(item1.ID, item1.HourBy - (item2 == null ? 0 : item2.HourBy));