Подтвердить что ты не робот

С# эквивалентно Java 8 "ссылка на метод"

Недавно у меня была возможность изменить код Java и воспользоваться некоторыми новыми функциями Java 8. В одном конкретном случае мне нужно было получить список свойств (String) .Name из списка объектов. Упрощенный пример того, что я сделал, был:

// sample data: <Thing> objects have a single String property called "Name" 
List<Thing> thingList =
    new ArrayList<>(Arrays.asList(new Thing("Thing1"), new Thing("Thing2")));

// first pass
List<String> nameList = new ArrayList<>();
thingList.forEach(x -> nameList.add(x.getName()));

// refinement 1: use stream, map, and collect
List<String> nameList1 =
    thingList.stream().map(x -> x.getName()).collect(Collectors.toList());

// refinement 2: use "Thing::getName" method reference
List<String> nameList2 =
    thingList.stream().map(Thing::getName).collect(Collectors.toList());

Мне было любопытно посмотреть, как эти подходы будут переводиться на С#, и я получил

// sample data: <Thing> objects have a single String property called "Name"
var thingList = new List<Thing> { new Thing("Thing1"), new Thing("Thing2") };

// first pass
var nameList = new List<String>();
thingList.ForEach(x => nameList.Add(x.Name));

// refinement 1: use Select and ToList
List<String> nameList1 = thingList.Select(x => x.Name).ToList();

То, что я еще не нашел (пока?) - это эквивалент С# "уточнения 2" для замены лямбда-выражения чем-то (чуть-чуть) более кратким. Существует ли С#, эквивалентный Java 8 "метод ссылки" в этом случае, учитывая, что я пытаюсь получить свойство каждого объекта (что в Java делается с помощью метода getProperty)?

4b9b3361

Ответ 1

Вам нужно было бы объявить метод вне Thing (или статический метод Thing), тогда вы могли бы передать ему ссылку на группу методов:

private string GetName(Thing thing)
{
    return thing.Name;
}

...

List<String> nameList1 = thingList.Select(GetName).ToList();

В С# 6 вы также можете использовать функцию выражения, чтобы сохранить пару строк:

private string GetName(Thing thing) => thing.Name;

Ответ 2

С# имеет эквивалент, эта функция является Callind Method Group

узнать больше:

Что такое группа методов в С#?

образец:

private static int[] ParseInt(string s)
{
    var t = ParseString(s);
    var i = t.Select(x => int.Parse(x));
    return i.ToArray();
}

с группой методов:

private static int[] ParseInt(string s)
{
    var t = ParseString(s);
    var i = t.Select(int.Parse);
    return i.ToArray();
}