markpjohnson
4/21/2016 - 4:47 PM

GroupAndFilterByType.cs

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
    }
}