在linq中,这个循环的等价物是什么

在linq中,这个循环的等价物是什么,linq,Linq,我有一个for循环,它搜索特定值的列表,并用新值替换它们 for (int i = 0; i < Data.Count; i++) { if (Data[i] > 0 && Data[i] <= 10) {Data[i] = 1;} else if (Data[i] > 10 && Data[i] < 20) {Data[i] = 2;} ... } for(int i=0;i0&&Data[i]10&&Data[i]

我有一个for循环,它搜索特定值的列表,并用新值替换它们

for (int i = 0; i < Data.Count; i++) {

if (Data[i] > 0 && Data[i] <= 10) {Data[i] = 1;}
else if (Data[i] > 10 && Data[i] < 20) {Data[i] = 2;}      
...
}
for(int i=0;i0&&Data[i]10&&Data[i]<20){Data[i]=2;}
...
}
我一直在尝试用linq编写此函数,我知道可以这样编写:

var Data2 = Data.Where(x=> x > 0 && x <= 10).Select(y=> y=1).ToList();
var Data2=Data.Where(x=>x>0&&xy=1).ToList();

我的问题是,有没有办法将这个for循环转换成linq形式,而不需要声明新的列表?我指的是在列表中搜索这些值的linq表单,当它找到这些值时,会相应地替换它们。

无论如何,我建议不要使用linq执行此操作:

Enumerable.Range(0,Data.Count)
          .ForEach(x=>{ 
              if (Data[x] > 0 && Data[x] <= 10) {Data[x] = 1;}
              else if (Data[x] > 10 && Data[i] < 20) {Data[x] = 2;} 
          });
Enumerable.Range(0,Data.Count)
.ForEach(x=>{
如果(数据[x]>0&&Data[x]10&&Data[i]<20){Data[x]=2;}
});

这样,您就不必声明第二个列表,但代码的可读性似乎不如原始列表。

确切的等价物是:

Data
  .Select((e,i) => new { Element = e, Index = i })
  .Where(ei => ei.Element > 0 && ei.Element < 20)
  .ToList()
  .ForEach(ei => Data[ei.Index] = (ei.Element <= 10) ? 1 : 2);
数据
.Select((e,i)=>new{Element=e,Index=i})
其中(ei=>ei.Element>0&&ei.Element<20)
托利斯先生()

.ForEach(ei=>Data[ei.Index]=(ei.Element比其他解决方案简单得多:

Data = Data.Select(d => (d / 10) + 1)

如果您想要一个上限,只需使用
Math.Min((d/10)+1,topLimit)

就地修改数据不是Linq的强项。Linq方法通常没有副作用。这就是为什么.ForEach()方法不是Linq方法,并且只为列表定义

但是,没有什么可以阻止您使用具有副作用的Linq函数。 因此我不推荐这种解决方案,但您可以在select语句中执行任何操作,甚至可以修改基础列表。还有一个select重载,它使用元素及其索引作为参数(select((元素,索引)=>)

所以你可以在for循环中使用select做任何事情,但是为了可读性,我建议使用for循环

data.Select((d,i)=>
    {if (d > 0 && d <= 10) data[i]=1 else if (d>10 && d<20 data[i]=2;})
    .All(d=>true); // <-- note that you do need some way to consume the IEnumerable
                   // in order to execute the .Select(). You can use ToList(), Count(), ..
数据。选择((d,i)=>

{if(d>0&&d 10&&d真);//为什么要在Linq中重写它?我想使用Linq的原因只不过是代码的清晰性,实际上我想在数据挖掘中使用它,因为我需要处理大量嘈杂的数据。我还对Linq解决方案感到好奇就地修改数据不是Linq的强项。Linq方法通常是副作用的这就是为什么.ForEach()方法不是Linq方法并且只为列表定义的原因。为什么不只为Data.ForEach(…);?因为您不能在ForEach调用中更改元素值。此列表l=新列表{1,1,1};l.ForEach(x=>x=2);Console.WriteLine(l[1]);打印1,而不是你建议的2。是的,这是因为需要索引。只是一个旁注:ForEach在普通LINQ中不存在,这是一个你不知道列表中是否包含大于20的元素,这些元素不会被更改。@BartoszKP我假设大于20,他有一个最大值可以返回。如果不是,那么当然是ot她的答案更好。请注意,正如问题中所述,10映射到1,但20不映射到2。当然,这可能是问题中的一个错误。@Matthewstrobbridge哎呀,我以为这是一个