使用Linq更改List <t>中的值

时间:2016-05-09 13:11:18

标签: c# linq

我有一个列表,如果该属性有小数,我想改变该列表中double属性的值。

如果x.Value有小数,我想改变那个值,只取第一个小数矩阵,然后四舍五入。

我正在尝试这个,但无法做到: (只有赋值,调用,递增,递减,等待和新对象表达式可以用作语句

return JsonErrorResult.JsonError(System.Net.HttpStatusCode.Unauthorized,
                                "error msg");

编辑: correctionQoutas是一个具有四个属性的自定义对象。 Double StartTime,Double EndTime,Double Value和string Id。

5 个答案:

答案 0 :(得分:1)

您在迭代时无法修改集合。

这是一个简单的方法

var list=correctionQoutas.ToList();

for(int i=0; i<list.Count(); i++)
   {
    if(list[i].Value % 1 != 0)
      { 
       list[i].Value = Convert.ToDouble(string.Format("{0:0.0}", list[i].Value)) ;
      }
   }

答案 1 :(得分:1)

如果您需要转换元素,则需要使用Select() LinQ函数:

var newList =
            correctionQoutas.Select(x => x.Value%1 != 0 ? x.Value = Convert.ToDouble(string.Format("{0:0.0}", x)) : x.Value = x.Value);

这会为您提供IEnumerable,以冻结内容并实际进行评估,您可以在ToList()功能之后使用Select()功能。

如果您只需要获取某种类型的元素,就可以执行此操作:

var subList = correctionQoutas.OfType<MyQuota>();

这将给出MyQuota或可直接分配给该类型的子集。这是一种过滤掉空值的简单方法。

答案 2 :(得分:1)

由于您要更改枚举中元素的属性,因此不应使用linq或List<T>.ForEach。 (您的问题听起来不像是要复制原始对象)。因此,只需遍历该枚举并设置新值:

foreach (var quota in correctionQoutas)
    quota.Value = (int)(quota.Value * 10) / 10d;

注意我通过简单算术剪切尾随小数,而不是将值转换为字符串并返回。

答案 3 :(得分:0)

无需深入研究您的实际转化功能。要使用linq语句获取CorrectionQuota的新列表,您可以执行以下操作:

var newList = correctionQoutas
   .Select(x => Convert(x))
   .ToList();

private  CorrectionQouta Convert(CorrectionQouta x){
    x.Value = x.Value % 1 != 0 ? 
        Convert.ToDouble(string.Format("{0:0.0}", x)) : x.Value);
    return x;
}

将结果转换为您想要的结果,然后创建新的列表。

答案 4 :(得分:0)

由于您无论如何都将结果保存到新的列表中,您只需Select结果:

哦,%无论如何都不会对你有任何好处,如果它完全有效,你的号码将首先转换为int

检查你是否有小数位也是必要的,因为无论如何输出都是双倍的。

// depending on what correctionQuotas is, you might be able to omit ToList()
var newList = correctionQoutas.Select(x => Math.Truncate(10 * x.Value) / 10).ToList();