基于 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

基于 LINQ 的条件更改值

如果你真的想在一行中做到这一点,那么你需要使用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;