我想在列表中计算与linq的运行差异但是无法使其工作。
以下是我要做的事情(简化版):
public class SampleCl
{
public string label;
public double val;
public double valdiff;
}
我有一个带有值和标签的类以及第三个带有差异的双。
一些示例数据:
var samplelist = new List<SampleCl>();
samplelist.Add(new SampleCl {label ="A", val= 1 });
samplelist.Add(new SampleCl { label = "B", val = 2 });
samplelist.Add(new SampleCl { label = "C", val = 3 });
下面的代码不起作用,但很好地展示了我想要做的事情:
samplelist.Where(a => a.valdiff = a.val - a.val.Where(a.label=="B"));
valdiff应该分别为A,B,C保持-1,0,1
答案 0 :(得分:4)
如果您真的想在一行中执行此操作,则需要使用ForEach
方法
但在我看来,这并不比简单的foreach循环好,并且在控制用于计算差异的基值的存在方面更弱
samplelist.ForEach(x => x.valdiff =
(x.val - samplelist.FirstOrDefault
(s => s.label== "B").val));
相反,简单的foreach循环会更简单,更容易理解,并且允许您使用键值对项目的存在进行精细检查。
// Assuming that you want to use zero if the item with label == B doesn't exist
double num = 0;
SampleCl baseItem = samplelist.FirstOrDefault(s => x.label == "B");
if(baseItem != null) num = baseItem.val;
foreach(var item in samplelist)
item.valdiff = item.val - num;
答案 1 :(得分:3)
我想你想做这样的事情。
var b = samplelist.First(a => a.label=="B");
foreach(var samp in samplelist)
samp.valdiff = samp.val - b.val;
答案 2 :(得分:2)
你在foreach的帮助下去了。
samplelist.ForEach(s => s.valdiff = s.val - samplelist.Single(b => b.label == "B").val);
答案 3 :(得分:1)
我想这可行:
var val = sampleList.Single(x => x.label == "B").val;
sampleList = sampleList.Select(x => new SampleCl
{
label = x.label,
val = x.val,
valdiff = x.value - val
}).ToList();
答案 4 :(得分:0)
如果您只想使用LINQ,则只有这样做:
var result = from a in samplelist
let b = samplelist.FirstOrDefault(b => b.label == "B")
let ab = a.valdiff = a.val - b.val
select a;