Как работать с коллекцией объектов разных классов через linq?

Пользователь

от lilla.herman , в категории: Другие , год назад

Как работать с коллекцией объектов разных классов через linq?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от terrence , год назад

@lilla.herman 

В LINQ (Language-Integrated Query) коллекции объектов разных классов можно работать, используя общий базовый класс или интерфейс для этих классов. LINQ предоставляет функциональность и операторы для работы с коллекциями, независимо от их типа.


Для начала необходимо определить общий базовый класс или интерфейс для классов, с которыми вы хотите работать. Например, если у вас есть классы "Person" и "Employee", и вы хотите работать с коллекцией, содержащей объекты обоих классов, можно создать интерфейс "IPerson", который будет реализован обоими классами:

1
2
3
4
5
public interface IPerson
{
    string Name { get; set; }
    int Age { get; set; }
}


Затем классы "Person" и "Employee" должны реализовывать этот интерфейс:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
public class Person : IPerson
{
    public string Name { get; set; }
    public int Age { get; set; }
}

public class Employee : IPerson
{
    public string Name { get; set; }
    public int Age { get; set; }
    public string Department { get; set; }
}


После этого можно работать с этими классами через LINQ. Например, с помощью метода "OfType" можно выбрать только объекты определенного типа:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
List<IPerson> people = new List<IPerson>
{
    new Person { Name = "John", Age = 30 },
    new Employee { Name = "Jane", Age = 25, Department = "HR" }
};

var employees = people.OfType<Employee>();
foreach (var employee in employees)
{
    Console.WriteLine($"Employee: {employee.Name}, Department: {employee.Department}");
}


Также, при необходимости, можно использовать методы "Cast" и "Select" для преобразования коллекции объектов в другой тип или выбора определенных свойств:

1
2
3
4
5
6
var names = people.Cast<Person>()
    .Select(person => person.Name);
foreach (var name in names)
{
    Console.WriteLine($"Name: {name}");
}


Таким образом, используя общий базовый класс или интерфейс, можно работать с коллекцией объектов разных классов через LINQ.

Пользователь

от quinton.prosacco , 7 месяцев назад

@lilla.herman 

Для работы с коллекцией объектов разных классов через LINQ следует использовать общий базовый класс или интерфейс, который будет реализован всеми классами в коллекции. Например,

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
interface IShape
{
    double GetArea();
}

class Circle : IShape
{
    public double Radius { get; set; }

    public double GetArea()
    {
        return Math.PI * Radius * Radius;
    }
}

class Rectangle : IShape
{
    public double Width { get; set; }
    public double Height { get; set; }

    public double GetArea()
    {
        return Width * Height;
    }
}


Затем создаем коллекцию объектов разных классов:

1
2
3
4
5
6
List<IShape> shapes = new List<IShape>
{
    new Circle { Radius = 3 },
    new Rectangle { Width = 4, Height = 5 },
    new Circle { Radius = 2.5 }
};


Можно использовать LINQ запросы для работы с этой коллекцией, например, для вычисления суммарной площади всех фигур:

1
double totalArea = shapes.Sum(shape => shape.GetArea());


Или для выбора фигур с площадью больше заданного значения:

1
var largeShapes = shapes.Where(shape => shape.GetArea() > 10);


Таким образом, LINQ позволяет удобно работать с коллекцией объектов разных классов, предоставляя удобные операторы для фильтрации, сортировки и преобразования данных.