我正在尝试编写一些与列表不同的东西,如果找到倍数,则在不同列表中设置属性。例如关于某事物发生的次数的计数器,也许是事件的最后日期。 这是我到目前为止所做的。
foreach(DataObject srcObj in ilSource){
if (ilDest.All(x => x.Property1 != srcObj.Property1 || x.srcObj != srcObj.Property2))
ilDest.Add(srcObj);
else
DataObject newObject = ilDest.SingleOrDefault(x => x.Property1 == srcObj.Property1 && x.Property2 == srcObj.Property2);
newObject.Propert3++;
newObject.Property4 = srcObj.Property5;
}
一旦下一次迭代发生,newObject属性就不会被保留,因为对象没有在集合中重新设置。如果没有Linq,我会手动遍历集合,抓取对象并进行更改,然后继续进行下一步,因为我有一个对象的真实副本。
提前感谢您提供的任何帮助
答案 0 :(得分:1)
这是我对你所要求的最佳解释。
试试这个:
var query =
from srcObj in ilSource
orderby srcObj.Property5
group srcObj by new
{
srcObj.Property1,
srcObj.Property2,
} into gs
select new
{
First = gs.First(),
Last = gs.Last(),
Count = gs.Count(),
};
foreach (var x in query)
{
x.First.Property3 = x.Count;
x.First.Property4 = x.Last.Property5;
}
var ilDest = query
.Select(x => x.First)
.ToList();
现有对象的修改需要foreach
循环,因为LINQ是关于查询而不是更新。
然而,我“修复”了你的代码并使我的答案产生了相同的结果。您的固定代码应如下所示:
foreach(DataObject srcObj in ilSource)
{
if (ilDest.All(x =>
x.Property1 != srcObj.Property1 || x.Property2 != srcObj.Property2))
ilDest.Add(srcObj);
else
{
DataObject newObject = ilDest.SingleOrDefault(x =>
x.Property1 == srcObj.Property1 && x.Property2 == srcObj.Property2);
newObject.Property3++;
newObject.Property4 = srcObj.Property5;
}
}