我今天一直在思考这个问题,我有一种唠叨的感觉,认为这很容易实现,而今天我只是摆脱它,但无论如何,这就是它。
而不是像
那样执行// 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#是否具备此类操作的能力?
答案 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()
答案 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.Hashtable
或System.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);
基本上是你正在寻找的。不知道如何将“回调”位插入到函数中。