将一个数组值复制到另一个数组

3
我有两个对象数组。第一个对象数组有一个属性,我想要将它复制到另一个数组中。
第一个对象数组:
HotelRoomResponse[] hr=new HotelRoomResponse[100];

第二个对象数组
RateInfos[] rt = new RateInfos[100];

现在我想做的是复制第一个数组的一个属性,比如说:
rt=hr[].RateInfo;

但是它会出错。正确的做法是什么????

RateInfos如何与HotelRoomResponse相关? - David Pilkington
想要更多相等的答案! - LINQ2Vodka
3个回答

6

你不能直接这样投射一个数组。实际上你需要循环 - 虽然你不需要在自己的代码中手动执行。例如,LINQ使它非常容易:

RateInfos[] rt = hr.Select(x => x.RateInfo).ToArray();

或者您可以使用Array.ConvertAll

RateInfos[] rt = Array.ConvertAll(hr, x => x.RateInfo);

在这两种情况下,仍然存在某个循环 - 只是不在您的代码中。
如果您对C#还很陌生,不了解LINQ、lambda表达式、委托等内容,那么您可以自己编写代码。
RateInfos[] rt = new RateInfos[hr.Length];
for (int i = 0; i < rt.Length; i++)
{
    rt[i] = hr[i].RateInfo;
}

这三种方法都可以达到相同的结果。

  • 第一种方法可能是现代C#中最惯用的方式。它适用于任何输入类型,你可以从 ToArray() 切换到 ToList(),以获得一个 List<RateInfos> 而不是数组等。
  • 第二种方法比第一种略微更有效率,并且可与.NET 2.0一起使用(而LINQ是在.NET 3.5中引入的)。但你需要使用C# 3或更高版本的编译器。该方法只能按原样使用于数组,但对于 List<T>,也有类似的ConvertAll 方法。
  • 第三种方法最有效率,但显然代码量更多。对新手来说更容易理解,但当你了解前两种解决方案的所有语言特性时,它并不能像前两种解决方案那样清晰地表达你所要实现的目标。

+1 对于 Array.ConvertAll。请注意,您仍需要 C# 3 编译器。 - Ilya Ivanov
@IlyaIvanov:它是.NET 2.0兼容的。它是在C# 3中引入的(没有C# 3.5这样的东西),但是当针对.NET 2.0时仍然可以使用它。我在我的答案中精心选择了措辞 :) - Jon Skeet
“C# 3.5” 这个说法并不存在,我想表达的是 .net 3.5。无论如何,你的回答非常出色,像往常一样。 - Ilya Ivanov
1
@IlyaIvanov:没错 - 但关键是Lambda表达式是C#的特性,而不是.NET库或CLR的特性。这就是为什么将语言版本与CLR或库版本分开非常重要的原因 :) - Jon Skeet

5
RateInfos[] rt = hr.Select(item => item.RateInfo).ToArray();

1
@DeepakRaghav: 你明白它是如何工作的吗?你使用过LINQ吗?值得花些时间阅读一下,确保你知道这里发生了什么。 - Jon Skeet
是的,我用过LINQ。虽然不是很多,但足以理解答案。 - Dee Raghav

2

使用LINQ:

RateInfos[] rt = hr.Select(x => x.RateInfo).ToArray();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接