C#/ PHP:在C#中是否有相当于PHP的array_map()函数?

时间:2010-09-01 22:15:06

标签: c# php arrays

我今天一直在思考这个问题,我有一种唠叨的感觉,认为这很容易实现,而今天我只是摆脱它,但无论如何,这就是它。

而不是像

那样执行
// assume that I have a populated string[] myString
for (int i = 0; i < myString.Length; i++) {
    myString[i] = myString[i].Equals(string.Empty) ? "foo" : "bar;
}

我想做一些像PHP array_map()这样的东西,我认为它比显式迭代执行得更快。

C#是否具备此类操作的能力?

3 个答案:

答案 0 :(得分:6)

使用扩展方法:

Func<string, string> mapFun = n => n.Equals(string.Empty) ? "foo" : "bar";
Enumerable<string> newNames = names.Select(mapFun);

您也可以直接传递Func

IEnumerable<string> newNames = names.Select(n => n.Equals(string.Empty) ? "foo" : "bar");

ideone。以下是一些或多或少等效的其他功能:

PHP                C#
-------------------------------
array_map()       .Select()
array_filter()    .Where()
array_reduce()    .Aggregate()

MSDN参考:

Enumerable Methods

答案 1 :(得分:2)

是的,只需使用其中一个Enumerable扩展方法即可。相当于array_map()的名称为Select()

var result = array.Select(item => item == "" ? "foo" : "bar");

对于这样的操作,请考虑使用IEnumerable<T>以上T[](数组),但如果您已有数组,则可以使用它,因为T[]实际实现了IEnumerable<T> }。

作为奖励,相当于array_filter()称为Where()

var nonEmpty = array.Where(item => item != "");

如果您对其他方法感到好奇,可以a pretty good list with examples on MSDN

答案 2 :(得分:1)

不,因为PHP数组与C#数组没有共同点(!)。 PHP数组是哈希表,更像是C#的System.Collections.HashtableSystem.Collections.Generic.Dictionary<k, v>刚才意识到这不适用于此,但它仍然很重要。

假设我正在正确读取您的伪代码,您可以使用LINQ查询执行您想要的操作:

var result = from item in collection
             select item.Empty() ? "foo" : "bar";

我不明白为什么你会认为像array_map这样的东西会比迭代更快 - 无论你怎么看它都会在某个地方进行迭代。在PHP中,使用内置函数可以提高速度,因为PHP被解释,而array_map的内容被编译;但C#是一种编译语言。

编辑:阅读文档后,它看起来像是

var result = from item in array
             select Callback(item);

基本上是你正在寻找的。不知道如何将“回调”位插入到函数中。