void Main()
{
// existing list
var apples = new List<Apple> { new Apple() };
var bananas = new List<Banana>();
var oranges = new List<Orange> { new Orange(), new Orange() };
// list of all objects
List<Foo> foos = new List<Foo> { new Apple(), new Banana(), new Orange() };
// group and filter original list by class type
apples.AddRange(foos.OfType<Apple>());
bananas.AddRange(foos.OfType<Banana>());
oranges.AddRange(foos.OfType<Orange>());
Console.WriteLine("Apples {0}", apples.Count); // 2
Console.WriteLine("Bananas {0}", bananas.Count); // 1
Console.WriteLine("Oranges {0}", oranges.Count); // 3
// if you also need to do processing, you can use DI
IContainer container = null;
IProcessor<Apple> appleProcessor = container.Resolve<IProcessor<Apple>>();
appleProcessor.DoWork(apples);
IProcessor<Banana> bananaProcessor = container.Resolve<IProcessor<Banana>>();
bananaProcessor.DoWork(bananas);
IProcessor<Orange> orangeProcessor = container.Resolve<IProcessor<Orange>>();
orangeProcessor.DoWork(oranges);
}
// Object types
class Foo { }
class Apple : Foo { }
class Banana : Foo { }
class Orange : Foo { }
// Processing classes
interface IProcessor<T>
{
void DoWork(List<T> items);
}
class AppleProcessor : IProcessor<Apple>
{
public void DoWork(List<Apple> items)
{
Console.WriteLine("Apples {0}", items.Count); // 2
}
}
class BananaProcessor : IProcessor<Banana>
{
public void DoWork(List<Banana> items)
{
Console.WriteLine("Bananas {0}", items.Count); // 1
}
}
class OrangeProcessor : IProcessor<Orange>
{
public void DoWork(List<Orange> items)
{
Console.WriteLine("Oranges {0}", items.Count); // 3
}
}