求一条Linq

兔子-顾问 2011-12-21 10:21:21
public class A
{
public int tick;
public double value;
}

List<A> dat1;
List<A> dat2;

dat1.Add(new A(){tick=1,value=2));
dat1.Add(new A(){tick=2,value=5));
dat2.Add(new A(){tick=2,value=4));
dat2.Add(new A(){tick=3,value=8));

希望用linq,将dat1中,tick和dat2中同样的对象,修改value为dat2对应对象的value.
...全文
256 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
q107770540 2011-12-21
  • 打赏
  • 举报
回复
dat1=(from t1 in dat1
join t2 in dat2
on t1.tick equals t2.tick into g
from t2 in g.DefaultIfEmpty()
select new A
{
ID=t1.ID,
tick=t1.tick,
value=t2==null?t1.value:t2.value
}).ToList();
阿非 2011-12-21
  • 打赏
  • 举报
回复

dat1.Join(dat2, d1 => d1.tick, d2 => d2.tick, (d1, d2) => new { d = d1, value = d2.value }).ToList().ForEach(r => r.d.value = r.value);
兔子-顾问 2011-12-21
  • 打赏
  • 举报
回复
或是我修改数据结构呢?
public class A2
{
public int tick;
public double value;
public int ID;
}

List<A> dat;

dat.Add(new A(){ID=1,tick=1,value=2));
dat.Add(new A(){ID=1,tick=2,value=5));
dat.Add(new A(){ID=2,tick=2,value=4));
dat.Add(new A(){ID=2,tick=3,value=8));

这样可以么?

或是之前的那种,实现类似

update dat1.value = dat2.value where dat1.tick = dat2.tick

这样的sql的效果?
阿非 2011-12-21
  • 打赏
  • 举报
回复
dat1.Join(dat2, d1 => d1.tick, d2 => d2.tick, (d1, d2) => new A { tick = d1.tick, value = d2.value })

要是考虑效率,这个就先计算结果。 你懂得
阿非 2011-12-21
  • 打赏
  • 举报
回复

dat1.ForEach(d =>
{
int temp = d.tick;
A a;
if ((a = dat1.Join(dat2, d1 => d1.tick, d2 => d2.tick, (d1, d2) => new A { tick = d1.tick, value = d2.value }).FirstOrDefault(t => t.tick == temp)) != null)
{ d.value = a.value; }
});
q107770540 2011-12-21
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 wuyazhe 的回复:]
这样new一个list会不会很慢呢
虽然这个表达式满足我要求了
[/Quote]
不是有延迟查询的么
q107770540 2011-12-21
  • 打赏
  • 举报
回复
10,12,13 楼不是我干的
fryhunter 2011-12-21
  • 打赏
  • 举报
回复
dat1.ForEach(item1 => item1.value = dat2.Exists(item2 => item2.tick == item1.tick) ? dat2.First(item2 => item2.tick == item1.tick).value : item1.value);

简化下。
fryhunter 2011-12-21
  • 打赏
  • 举报
回复
dat1.FindAll(item1 => dat2.Exists(item2 => item2.tick == item1.tick)).
ForEach(item1 => item1.value = dat2.First(item2 => item2.tick == item1.tick).value);
兔子-顾问 2011-12-21
  • 打赏
  • 举报
回复
看实际对象的构造函数以及多少对象,只是这个例子说快慢似乎多余了。
赳赳老陈 2011-12-21
  • 打赏
  • 举报
回复
这么多兔子!
兔子-顾问 2011-12-21
  • 打赏
  • 举报
回复
这样new一个list会不会很慢呢
虽然这个表达式满足我要求了
q107770540 2011-12-21
  • 打赏
  • 举报
回复

//更正一下:
void Main()
{

List<A> dat1=new List<A>();
List<A> dat2=new List<A>();;

dat1.Add(new A(){tick=1,value=2});
dat1.Add(new A(){tick=2,value=5});
dat2.Add(new A(){tick=2,value=4});
dat2.Add(new A(){tick=3,value=8});

dat1=(from t1 in dat1
join t2 in dat2
on t1.tick equals t2.tick into g
from t2 in g.DefaultIfEmpty()
select new A
{
tick=t1.tick,
value=t2==null?t1.value:t2.value
}).ToList();

}
public class A
{
public int tick;
public double value;
}
q107770540 2011-12-21
  • 打赏
  • 举报
回复
来了来了,Sorry,公司上不了Q
q107770540 2011-12-21
  • 打赏
  • 举报
回复

void Main()
{

List<A> dat1=new List<A>();
List<A> dat2=new List<A>();;

dat1.Add(new A(){tick=1,value=2});
dat1.Add(new A(){tick=2,value=5});
dat2.Add(new A(){tick=2,value=4});
dat2.Add(new A(){tick=3,value=8});
var query=from t1 in dat1
join t2 in dat2
on t1.tick equals t2.tick
select new A
{
tick=t1.tick,
value=t2.value
};
dat1=query.ToList();

}
public class A
{
public int tick;
public double value;
}
蝶恋花雨 2011-12-21
  • 打赏
  • 举报
回复
等会他马上就出现了。
兔子-顾问 2011-12-21
  • 打赏
  • 举报
回复
Tim看到请回复一下QQ。急用…
pol000 2011-12-21
  • 打赏
  • 举报
回复
111
兔子-顾问 2011-12-21
  • 打赏
  • 举报
回复
dat1.Where(d=>dat2.Any(d2=>d2.tick==d.tick)).ToList().ForEach(dt=>dt.value = dat2.Find(d3=>d3.tick==dt.tick).value);

我自己这样肯定写的不好。
showjim 2011-12-21
  • 打赏
  • 举报
回复
GroupBy也可以
            foreach (var value in dat1.Concat(dat2).GroupBy(value => value.tick)) value.First().value = value.Last().value;
加载更多回复(1)

8,497

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 LINQ
社区管理员
  • LINQ
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧