基于 LINQ 的条件更改值
本文关键字:条件 LINQ 基于 | 更新日期: 2023-09-27 18:35:10
我想计算 sth 就像列表上的 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 应该分别保持 -1、0、1 对于 A、B、C
如果你真的想在一行中做到这一点,那么你需要使用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;
我想你想做这样的事情。
var b = samplelist.First(a => a.label=="B");
foreach(var samp in samplelist)
samp.valdiff = samp.val - b.val;
在foreach的帮助下,你去吧。
samplelist.ForEach(s => s.valdiff = s.val - samplelist.Single(b => b.label == "B").val);
我想这可能会起作用:
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();
如果您只想使用 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;