Поиск в элементах коллекции List - C#
Формулировка задачи:
Как можно реализовать метод для подсчета определенных параметров, которые хранятся внутри элементов такой вот коллекции:
Проблема в том что я могу оперировать элементами, но не пойму как получить доступ "внутрь" элементов коллекции coll
List<LiveBeings> coll = new List<LiveBeings>();
Horse h = new Horse();
Dog d = new Dog();
Crucian c = new Crucian();
FishSmallfry f = new FishSmallfry();
coll.Add(h);
coll.Add(d);
coll.Add(c);
coll.Add(f); Решение задачи: «Поиск в элементах коллекции List»
textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
public class Program
{
public static void Main(string[] args)
{
var coll = new List<LiveBeings>();
coll.Add(new Dog());
coll.Add(new Dog());
coll.Add(new Horse());
coll.Add(new FishSmallfry());
var list = coll.GetObjectsWithField("Legs");
foreach (var e in list)
{
Console.WriteLine(e.GetType().Name);
}
Console.WriteLine(list.Sum());
}
}
internal static class FilterList
{
public static int Sum(this IEnumerable<LiveBeings> source)
{
if (source == null)
throw new ArgumentNullException("source");
var num = 0;
foreach (var leg in source.ToList().GetObjectsWithField("Legs"))
{
checked
{
num += ((dynamic) leg).Legs;
}
}
return num;
}
public static IEnumerable<T> GetObjectsWithField<T>(this List<T> list, string fieldName)
{
return list.Where(e => HasField(e, fieldName));
}
private static bool HasField<T>(T element, string fieldName)
{
var t = element.GetType();
return t.GetFields(BindingFlags.Public | BindingFlags.Instance).Any(f => f.Name == fieldName);
}
}
internal class FishSmallfry : LiveBeings
{
}
internal class Crucian : LiveBeings
{
}
internal class Dog : LiveBeings
{
public int Legs = 4;
}
internal class Horse : LiveBeings
{
public int Legs = 4;
}
internal class LiveBeings
{
}