Создать строку из свойств объекта, используя выражения Lamba - PullRequest
0 голосов
/ 29 октября 2011

Это связано с моим вопросом на Забавно (?) С выражениями Linq в методах расширения , но это скорее абстракция части, которую я пытаюсь понять.Я действительно испытываю трудности с тем, чтобы обернуть свой мозг вокруг этой концепции.

Учитывая объект, определенный следующим образом:

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 + ")")

было равно 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 ]

1 голос
/ 29 октября 2011

Вот рабочий пример из 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);
}

Вам просто нужно объявить делегат, который возвращает строку, вызывается как угодно и принимает один параметр 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); 
    }
}
0 голосов
/ 29 октября 2011

Исходя из вашего описания (если я правильно его читаю), похоже, вам просто нужно использовать Select.

var itemsAsStrings = foo.Select(x => x.itemId.ToString() + "(" + x.itemName + ")");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...