С# эквивалентно 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
)?
Ответы
Ответ 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();
}