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.

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.

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