这与我在Fun (?) with Linq Expressions in extension methods的问题有关,但这更像是我试图理解的一件作品的抽象。我真的很难绕过这个概念。
给定一个如下定义的对象:
public class item
{
public int itemId { get; set; }
public string itemName { get; set; }
public string itemDescription { get; set; }
}
和IEnumerable<item> foo
,
让我说我想写一个扩展方法,使表达式
foo.GetFullDescription(x => x.itemId.ToString() + "(" + x.itemName + ")")
将等于包含Lambda表达式中定义的连接项的IEnumerable<string>
。例如,如果我的foo
对象只包含一个item
对象:
{
fooItem.itemId = 1
fooItem.itemName = "foo"
fooItem.itemDescription = "fooDescription"
}
...我在扩展方法的结果中分配了一个变量,如下所示:
var bar = foo.GetFullDescription(x => x.itemId.ToString() + "(" + x.itemName + ")");
...我会bar
成为IEnumerable<string>
,其中包含一个项目,该项目等于1(foo)
。
我该如何编写该扩展方法?第一部分相对简单:
public static IEnumerable<string> GetFullDescription(this IEnumerable<item> target, <some expression?> expr){
}
一些帮助将不胜感激。简单的解释将非常感激。
答案 0 :(得分:1)
这是LINQPad的一个工作示例。只需复制并通过它。
void Main()
{
System.Console.WriteLine(GetFullDescription(new Item(){itemId = 2, itemName="two"},
x => x.itemId.ToString() + "(" + x.itemName + ")"));
}
public delegate string Lambda (Item item);
public class Item
{
public int itemId { get; set; }
public string itemName { get; set; }
public string itemDescription { get; set; }
}
// Define other methods and classes here
public static string GetFullDescription(Item item, Lambda lambda){
return lambda(item);
}
您只需声明一个返回字符串的Delegate,随意调用,并接受单个Item参数。记住,委托基本上是一个函数变量,你定义函数的输入和输出。在这里,我认为是您的完整扩展方法
public delegate string Lambda (Item item);
public static string GetFullDescription(this IEnumerable<Item> items, Lambda lambda){
foreach(var item in items){
return yield lambda(item);
}
}
答案 1 :(得分:0)
根据您的描述(如果我正确阅读),看起来您只需要使用Select。
var itemsAsStrings = foo.Select(x => x.itemId.ToString() + "(" + x.itemName + ")");