Laden...

In-Methode in C#

Erstellt von tkrasinger vor 15 Jahren Letzter Beitrag vor 15 Jahren 6.163 Views
T
tkrasinger Themenstarter:in
574 Beiträge seit 2008
vor 15 Jahren
In-Methode in C#

Beschreibung:

Prüft ob ein Wert in einer Liste von Werten enthalten ist. (Bekannt aus SqlServer).
Die tatsächliche Namensgebung In, IsIn, IsInList oder sonstwas überlass ich jedem selbst 😉


/// <summary>
/// Returns true if a given value is contained in a list of values
/// </summary>
public static bool IsIn<T>(T value, params T[] values) where T : IComparable
{
    if (values == null || values.Length == 0)
        return false;
    List<T> lst = new List<T>(values);
    return lst.Contains(value);
}

Tests dazu:

[TestMethod(true)]
public bool IsInTest(TestContext testContext)
{
    Assert.AreEqual(Active.Utility.IsIn<short>(50, 10, 20, 30, 40), false);
    Assert.AreEqual(Active.Utility.IsIn<short>(50, 10, 20, 30, 40,50), true);
    Assert.AreEqual(Active.Utility.IsIn<string>("B", "A", "B", "C"), true);
    Assert.AreEqual(Active.Utility.IsIn<string>("D", "A", "B", "C"), false);
    Assert.AreEqual(Active.Utility.IsIn<DateTime>(
        new DateTime(2008,1,1), new DateTime(2007,1,1), 
        new DateTime(2008,1,1), new DateTime(2009,1,1)), true);
    Assert.AreEqual(Active.Utility.IsIn<DateTime>(
        new DateTime(2006, 1, 1), new DateTime(2007, 1, 1),
        new DateTime(2008, 1, 1), new DateTime(2009, 1, 1)), false);
    Assert.AreEqual(Active.Utility.IsIn<short>(50), false);
    return true;
}

Schlagwörter: <In, In in C#, Wert in Liste>

PS: Als Extension Methode sollte es das sein: (kann ich leider nicht prüfen):

/// <summary>
/// Returns true if a given value is contained in a list of values
/// </summary>
public static bool IsIn<T>(this T value, params T[] values) where T : IComparable
{
    if (values == null || values.Length == 0)
        return false;
    List<T> lst = new List<T>(values);
    return lst.Contains(value);
}
Q
214 Beiträge seit 2006
vor 15 Jahren

Hallo,
leider erkenn ich den Sinn nicht ganz. Wenn ich eine List oder Hashtable/Dictonary verwende, dann kann ich die Methode Contains verwenden.
Was mir nun IsIn bringt, ist mir fraglich. Wann übergebe ich mal einer Methode mehrere Parameter um zu testen, ob dort der Wert enthalten ist? Eher selten.

Sinnvoller wäre da, wenn IsIn allgemein arbeitet, ich diesem ein Array, List, Hashtable, Dictonary oder eine param List übergeben könnte. Nur eine param List halte ich persönlich für etwas nutzlos, da solchen Daten meist eh in irgendwelchen Datenstrukturen (Liste, Hashtable, bin. Baum) anfallen und diese eigentlich eine Contains Methode anbieten sollten.

T
tkrasinger Themenstarter:in
574 Beiträge seit 2008
vor 15 Jahren

Siehe zB:

if Abfrage auf mehrere Werte gleichzeitig prüfen?

oder ein Beispiel aus meinem Code:

if (Active.Utility.IsIn<string>(_currentPerson.Aktuell.BEARBKZ, "E", "N", "W"))
{
    _currentPerson.Aktuell.STATUS = "H";
}

Ich denke, dass man nicht immer alles in Listen hat, v.a. bei Prüfungen auf nur 2-3 Werte. Außerdem kannst du eine Liste übergeben:

List<short> lst = new List<short>();
lst.Add(50);
lst.Add(10);
lst.Add(20);
Assert.AreEqual(Active.Utility.IsIn<short>(50,lst.ToArray()), true);
104 Beiträge seit 2004
vor 15 Jahren

Hallo tkrasinger

Außerdem kannst du eine Liste übergeben:

  
C#-Code:  
List<short> lst = new List<short>();  
lst.Add(50);  
lst.Add(10);  
lst.Add(20);  
Assert.AreEqual(Active.Utility.IsIn<short>(50,lst.ToArray()), true);  

In dem oberen Code wird aus einer Liste ein Array und dann wieder aus dem Array eine Liste erstellt um die Methode Contains() derselbigen zu verwenden. Das ist meiner Meinung nach Sinnfrei, da die Liste selbst schon eine Containsmethode enthält.

Zu deiner genersichen IsIn-Methode:

Contains macht ja nichts anderes als die Elemente eine Liste mit dem gesuchten Element zu vergleichen. Sobald eins gefunden wurde wird true zurück geliefert, andernfalls false.

Wenn man diese Funktionalität direkt implementieren würde, könnte man sich das erstellen einer zusätzlichen Liste sparen.

Grüße

Schaut mal im IRC vorbei:
Server: irc.euirc.net
Channel: #C#

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo Tachyon,

der Parametertyp ist aber wegen des beabsichtigten params nunmal auf ein Array festgelegt. Die Performance ist vielleicht nicht die beste, aber sinnfrei ist es sicher nicht. Man könnte aber Array.IndexOf verwenden, um zumindest eine der Umwandlungen zu sparen. Und man könnte natürlich zusätzlich auch eine Überladung mit IList<T> als Parameter schaffen, die dann mit Contains arbeitet.

herbivore

104 Beiträge seit 2004
vor 15 Jahren

Hallo herbivore,

die generische List-Klasse besitzt bereits eine Methode Contains() die das selbe macht wie die IsIn-Methode. Darum, wiedersprech mir wenn ich falsch liege, würde man das selbe Ergebnis erziehlen wenn man diese direkt benutzt.

Das mit dem Sinnfrei war auch nicht böse gemeint, ich finde es nur unnötig ein Array aus einer Liste zu holen, aus diesem wieder eine Liste zu generieren um dann die die Containsmethode derselbigen zu nutzen.

Gruß

Schaut mal im IRC vorbei:
Server: irc.euirc.net
Channel: #C#

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo Tachyon,

die generische List-Klasse besitzt bereits eine Methode Contains() die das selbe macht wie die IsIn-Methode.

Die Contains-Methode kann man aber nicht so aufrufen, wie die IsIn-Methode. Stichwort: params. Siehe auch die Aufrufbeispiele oben. Dass man auch (Listen als) Arrays übergeben kann, ist eher ein Nebeneffekt. Ich denke, damit können wir die Diskussion jetzt beenden. In ".NET-Komponenten und C#-Snippets" sollen die Threads bitte möglichst kurz gehalten werden.

herbivore