根据LINQ

时间:2016-02-17 20:04:27

标签: c# linq

我想在列表中计算与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

5 个答案:

答案 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;