Sprawdzenie czy lista zawiera elementy różnych typów

Odpowiedz Nowy wątek
2011-08-26 03:29
0

Mam na razie takie coś:

if (events.OfType<A>().Count() > 1 || events.OfType<B>().Count() > 1 || events.OfType<C>().Count() > 1 || events.OfType<D>().Count() > 1)
{
    throw new ArgumentException("Lista zdarzeń nie może zawierać dwóch zdarzeń takiego samego typu!");
}

A, B, C, D to klasy dziedziczące z bazowej N.
Ma ktoś pomysł jak to ładniej napisać? Tak, żebym nie musiał rozbudowywać ifa, gdy dodam nową klasę dziedziczącą po N.


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."

Pozostało 580 znaków

2011-08-26 04:33
H. Curry

Nie podchodzisz do problemu aby zbyt dosłownie?

using System;
using System.Collections.Generic;
using System.Linq;
 
namespace SomekindUniqTypes
{
    class Program
    {
        public interface ISomekindEvent { };
 
        public class SomekindEvent1 : ISomekindEvent { };
 
        public class SomekindEvent2 : ISomekindEvent { };
 
        public class SomekindEvent3 : ISomekindEvent { };
 
        public static bool containsUniqueTypes(IEnumerable<ISomekindEvent> col)
        {
            return col.GroupBy(x => x.GetType()).All(t => t.Count() == 1);
        }
 
        static void Main(string[] args)
        {
            List<ISomekindEvent> expected = new List<ISomekindEvent> 
            {
                new SomekindEvent1(), 
                new SomekindEvent2(),
                new SomekindEvent3(),
            };
            List<ISomekindEvent> invalid = new List<ISomekindEvent>  
            {
                new SomekindEvent3(),
                new SomekindEvent3(),
                new SomekindEvent3(),
            };
            Console.WriteLine("expected: {0}", containsUniqueTypes(expected));
            Console.WriteLine("invalid: {0}", containsUniqueTypes(invalid));
        }
    }
}

Pozostało 580 znaków

2011-08-26 10:07
Gues
0

Może pogrupuj zdarzenia po typie i sprawdź czy któreś występuje więcej niż jeden raz

var eventTypes = events.GroupBy( 
    evnt => evnt.GetType(),
    ( type, evnts ) => new { 
        Key = type,
        Count = evnts.Count()
    } );
 
if( eventTypes.Any( et => et.Count > 1 ) )
{
    throw new ArgumentException( "Lista zdarzeń nie może zawierać dwóch zdarzeń takiego samego typu!" );
}

Pozostało 580 znaków

2011-08-26 10:10
Gues
0

Nie wiem dlaczego nie zauwazyłem poprzedniego posta o_O. Nie jestem zalogowany więc proszę moderatora o usunięcie moich postów.

Pozostało 580 znaków

2011-08-26 18:03
0

Ech, widzę, że jak człowiek bliżej pięćdziesiątki niż dalej, to już coraz gorzej się myśli w nocy. :(
Dzięki za pomoc.


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0