Составьте список целых чисел для объектов - PullRequest
0 голосов
/ 22 октября 2019

Существует ли краткая форма (возможно, использующая LINQ) для создания integers до objects и добавления их в List?

Я думаю, что-то вроде List<Car> TestList = car1.Neighbors.To(c => cars[c]);

using System;
using System.Collections.Generic;                   
public class Program
{
    public static void Main()
    {
        // Cars
        Car car0 = new Car(0, new List<int> { 1 });
        Car car1 = new Car(1, new List<int> { 0, 2 });
        Car car2 = new Car(2, new List<int> { 1 });
        List<Car> cars = new List<Car> { car0, car1, car2 };

        // THIS I WANT TO SHORTEN ▼▼▼▼▼▼▼▼▼▼
        List<Car> TestList = new List<Car>();
        foreach (int i in car1.Neighbors)
            TestList.Add(cars[i]);
        // ▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲

        Console.Write("Neighbors of car 1:");
        foreach (Car car in TestList)
            Console.Write(" car" + car.Index);
    }   

    public class Car
    {
        public int Index; // index of the car
        public List<int> Neighbors; // car indexes, that are parked near to this car
        public Car (int index, List<int> neighbors)
        {
            Index = index;
            Neighbors = neighbors;
        }
    }
}

Ответы [ 3 ]

3 голосов
/ 22 октября 2019

Вы должны использовать Enumerable.Select (из System.Linq), который проецирует каждый элемент последовательности в новую форму (https://docs.microsoft.com/en-us/dotnet/api/system.linq.enumerable.select?view=netframework-4.8)

IEnumerable<Car> TestList = car1.Neighbors.Select(i => cars[i]);

или это, если вам абсолютно необходим List

List<Car> TestList = car1.Neighbors.Select(n => cars[n]).ToList();
2 голосов
/ 22 октября 2019

Я думаю вы спрашиваете о чем-то вроде car1.Neighbors.Select(x => cars[i]).ToList(), однако;честно говоря, я бы предложил хранить список ссылок , а не список индексов - если у вас нет очень специфических потребностей (обычно связанных с продвинутыми стратегиями индексации). List<Car>, как Neighbors, будет работать гораздо более напрямую и позволит избежать много проблем. Если вы используете x86, это даже не будет стоить ничего лишнего;в x64, да 64-битная ссылка немного больше, чем 32-битное целое число, но вы избегаете всего косвенного обращения и всех проблем управления индексами. При этом этот код становится буквально:

var neighbors = car1.Neighbors;
1 голос
/ 22 октября 2019
List<Car> TestList = new List<Car>(car1.Neighbors.Select(x => cars[x]));

Или

List<Car> TestList = new List<Car>(cars.Where(x => car1.Neighbors.Contains(x.Index)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...