.NET 4.x Как определить тип элемента в ArrayList? - C#
Формулировка задачи:
Есть класс абстрактный животные, от него наследуются 2 класса хищники и травоядные, от этих классов наследуются классы, волк, олень, заяц, лиса. В мейне создаются экземпляры четырех последних классов и добавляются в коллекцию ArrayList. Нужно определить колличество экземпляров каждого из классов в данной коллекции. Не могу понять как обратиться к итому элементу коллекции и определить тип этого элемента. Вот текст задания -
Создать класс «животные», производные классы «хищники» и «травоядные», затем производные классы
«волк», «лиса», «заяц», «олень». Содержимое класса – на собственное усмотрение. Создать массив
объектов с произвольным количеством экземпляров всех указанных классов и подсчитать, сколько в
массиве хищников и травоядных, волков, лис, зайцев и оленей 2.
Решение задачи: «.NET 4.x Как определить тип элемента в ArrayList?»
textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Linq;
namespace _
{
class Program
{
public static void Main()
{
List<Animal> animal = new List<Animal>
{
new Wolf(),
new Fox(),
new Hare(),
new Wolf(),
new Fox(),
new Hare(),
new Deer(),
new Hare(),
new Deer(),
new Deer(),
new Hare(),
new Deer(),
new Fox(),
new Hare(),
};
// Если не переопределен ToString()
var type = animal.Select(a => a.ToString()).Select(a => Type.GetType(a));
var baseType = animal.Select(a => a.ToString()).Select(a => Type.GetType(a).BaseType);
// но это лишнее, т.к. есть
var types = animal.Select(a => a.GetType());
var baseTypes = animal.Select(a => a.GetType().BaseType);
Console.WriteLine(string.Join(" ", type));
Console.WriteLine(string.Join(" ", baseType));
Console.WriteLine(string.Join(" ", types));
Console.WriteLine(string.Join(" ", baseTypes));
Console.WriteLine();
var typp = animal.Select(a =>
new {
type = a.GetType(),
baseType = a.GetType().BaseType
})
.ToLookup(t=> t.baseType, t=>t.type);
foreach(var t in typp)
{
Console.WriteLine(t.Key);
Console.WriteLine(string.Join(" ", t.Select(tt => tt)));
}
Console.WriteLine();
// Ну и решение по ТЗ в одну строчку
Console.WriteLine(string.Join(Environment.NewLine, typp.Select(t => $"{t.Key} {t.Count()}{Environment.NewLine}{(string.Join(" ", t.GroupBy(tt=>tt).Select(tt=> $"{tt.Key} {tt.Count()}")))}")));
Console.ReadLine();
}
}
abstract class Animal
{ }
abstract class Predator : Animal
{ }
abstract class Herbivores : Animal
{ }
class Wolf : Predator
{ }
class Fox : Predator
{ }
class Hare : Herbivores
{ }
class Deer : Herbivores
{ }
}