使用Lambda表达式从对象的属性创建一个字符串

时间:2011-10-29 03:22:07

标签: linq c#-4.0 lambda

这与我在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){


}

一些帮助将不胜感激。简单的解释将非常感激。

2 个答案:

答案 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 + ")");