2017-06-19 60 views
1

试想一下,我已经有了一个doulbe两个数组称为一个C#如何从一个阵列转换一定范围到另一个

我想从采取一部分(范围),适用于一些功能,以在该部分的每一个元素和把结果保存到的一部分(范围)。

我知道如何使用C++使用std :: transform来实现它。

但是对于C#呢?

P.S. C++代码:

double *src = new double[100]; 
double *dst = new double[24]; 

std::generate(src,src+100,[]() { return 0.25; }); 
std::generate(dst,dst+24,[]() { return 1.0; }); 

std::transform(src+12,src+24,dst+12, [](double d) { return d*d*sqrt(d); }); 

delete[] src; 
delete[] dst; 

enter code here 

回答

2

您可以使用LINQ进行转换。既然你是在最后删除dst,并在转换过程中完全填满,没有必要写现有阵列:

var src = Enumerable.Range(0, 100).Select(_ => 0.25).ToArray(); 
var dst = src.Skip(12).Take(12).Select(d => d*d*Math.Sqrt(d)).ToArray(); 

我不得不只覆盖一个仅使用B部分的一部分的

如果需要覆盖现有条目,使用CopyTo方法:

var src = Enumerable.Range(0, 100).Select(_ => 0.25).ToArray(); 
var dst = new double[50]; 
src.Skip(12).Take(12).Select(d => d*d*Math.Sqrt(d)).ToList().CopyTo(dst, 31); 
+0

略好于我,因为我的大脑放屁并没有使用Select来填充原始数组。 lol – Steve

+0

问题是:** B **充满了我需要的数据,我只能用** A **的一部分覆盖** B **的一部分。 我明白了,如何用** Skip **和** Take **来提取范围。现在,如何覆盖** dst **的一部分,而不是创建一个新的** dst **? – Lionishy

+0

我懂了!谢谢! – Lionishy

1
using System; 
using System.Collections.Generic; 
using System.Linq; 

namespace ConsoleApp1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var src = new List<double>(); 

      for (int i = 0; i < 100; i++) 
       src.Add(0.25D); 

      var dst = src.Skip(12).Take(12).Select(d => d * d * Math.Sqrt(d)); 
     } 
    } 
} 

代码的最后一行是您真正要求的代码,Skip将跳过第一个12,Take使用下一个12,并且Select执行您要求的转换。

+0

尽管此代码片段可能会解决问题,但[包括解释](// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)确实有助于提高您的帖子的质量。请记住,您将来会为读者回答问题,而这些人可能不知道您的代码建议的原因。也请尽量不要用解释性注释来挤占代码,这会降低代码和解释的可读性! – gunr2171