Willkommen bei dotnet-snippets.de! Snippet hinzufügen Login Registrieren
Snippets in der Datenbank: 1562 | Anzahl registrierter User: 1893 | Besucher online: 298
Hauptmenü
Home
Top Ten
Zufälliger Snippet
FAQs
.NET Community
dotnet-forum.de
dotnet-kicks.de
Social

RSS Feeds
Rss Alle Snippets
Rss C#
Rss VB.NET
Rss C++
Rss ASP.NET
Partner
Member of Microsoft Community Leader/Insider Program (CLIP)

Filtern mit dem Blacklist - Whitelist Verfahren


Autor: Jan Welker
Sprache: C#
Bewertung:
8.69 (3 votes)
Anzahl der Aufrufe: 6625
  
Kick it on dotnet-kicks.de  

Beschreibung:

Mit dieser Klasse können Listen mit Hilfe der Black and Whitelist gefiltert werden.

Dank IList können z.B. List Objekte oder Arrays übergeben werden.
Die Listenelemente müssen sich als Key für ein Dictionary eignen, das ist bei String immer der Fall.

Danke an herbivore für das das Feintuning.


Abgelegt unter: black and white, blacklist, whitelist, Dictionary, Generic, Filter.



C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
using System.Collections.Generic;

namespace Filter
{
    internal class BlackWhite<T>
    {
        private Dictionary<T, bool> black = new Dictionary<T, bool>();
        private Dictionary<T, bool> white = new Dictionary<T, bool>();

        public BlackWhite(IList<T> black, IList<T> white)
        {
            foreach (T t in black) {
               this.black [t] = true;
            }
            foreach (T t in white) {
               this.white [t] = true;
            }
        }

        public List<T> GetGoodList(IList<T> inputList)
        {
            List<T> goodList = new List<T>();

            foreach (T t in inputList)
            {
                if (white.ContainsKey(t) || !black.ContainsKey(t)) {
                    goodList.Add(t);
                }
            }
            return goodList;
        }
    }
}
Sie haben Fragen zu diesem Snippet oder brauchen Hilfe bei der .NET Entwicklung?
Freundliche und kompetente Entwickler helfen Ihnen gern weiter im Forum für .NET Entwicklung.



Kommentare:
(Zum Schreiben von Kommentaren bitte anmelden.)

Jan Welker schrieb am:  17.01.2010 03:02:11

Der Code könte dadurch vereinfacht werden, dass auf die Umwandlung in ein Dictionary<T, bool> verzichtet wird, weil IList<T> bereits über eine Contains-Methode verfügt. Damit können black und white als IList<T> deklariert werden und können im Konstruktor direkt zugewiesen werden. Damit erspart man sich die unbenötigten bool-Werte des Dictionarys. Dadurch entfallen weiter die Foreach-Schleifen im Konstruktor, die zudem fehleranfällig sind, weil in den übergebenen IList-Colletions identische Einträge vorhanden sein können, die Key-Werte in einem Dictionary aber eindeutig sein müssen. In GetGoodList ist dann beim Schleifendurchlauf lediglich der Methodenaufruf "white.ContainsKey(t)" durch "white.Contains(t)" zu ersetzen.
Die Funktionalität lässt sich auch etwas anders implementieren (Beispiel in VB:

Friend Class BlackWhiteEx(Of T)
Private _black As New HashSet(Of T)
Private _white As New HashSet(Of T)

Public Sub New(black As IList(Of T), white As IList(Of T))
Me._black.UnionWith(black.AsEnumerable)
Me._white.UnionWith(white.AsEnumerable)
End Sub

Public Function GetGoodList(inputList As IList(Of T)) As List(Of T)
Dim goodList As New List(Of T)
Dim htResult As New HashSet(Of T), htWhite As New HashSet(of T)
htWhite.UnionWith(_white.AsEnumerable)
htResult.UnionWith(inputList.AsEnumerable)
htWhite.IntersectWith(inputList.AsEnumerable)
htResult.ExceptWith(_black.AsEnumerable)
htResult.UnionWith(htWhite.AsEnumerable)
goodList = htResult.ToList
Return goodList
End Function
End Class

Der Unterschied: In der zurückgegebenen "GoodList" sind alle mehrfach enthaltenen Einträge der Ausgangsliste bis auf einen entfernt, d. h. die Ergebnisliste enthält keine doppelten oder mehrfachen Werte mehr.


schlecht sehr gut
1 2 3 4 5 6 7 8 9 10
Nur angemeldete User können Snippets bewerten.