Недавно у меня была возможность изменить код 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
)?