myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Gemeinschaft » .NET-Komponenten und C#-Snippets » In-Methode in C#
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

In-Methode in C#

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
tkrasinger tkrasinger ist männlich
myCSharp.de-Mitglied

Dabei seit: 26.03.2008
Beiträge: 574
Herkunft: Enzesfeld (Niederösterreich)


tkrasinger ist offline

In-Methode in C#

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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 ;-)

C#-Code:
/// <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:

C#-Code:
[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):

C#-Code:
/// <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);
}
Neuer Beitrag 04.10.2008 12:37 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Qwald
myCSharp.de-Mitglied

Dabei seit: 31.03.2006
Beiträge: 214


Qwald ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.
Neuer Beitrag 04.10.2008 14:00 Beiträge des Benutzers | zu Buddylist hinzufügen
tkrasinger tkrasinger ist männlich
myCSharp.de-Mitglied

Dabei seit: 26.03.2008
Beiträge: 574
Herkunft: Enzesfeld (Niederösterreich)

Themenstarter Thema begonnen von tkrasinger

tkrasinger ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Siehe zB:

 if Abfrage auf mehrere Werte gleichzeitig prüfen?

oder ein Beispiel aus meinem Code:

C#-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:

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);
Neuer Beitrag 04.10.2008 14:20 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Tachyon Tachyon ist männlich
myCSharp.de-Mitglied

avatar-2846.jpg


Dabei seit: 17.06.2004
Beiträge: 104
Entwicklungsumgebung: VS 2005 / 2008


Tachyon ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo tkrasinger

Zitat:
Außerdem kannst du eine Liste übergeben:

C#-Code:
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
Neuer Beitrag 05.10.2008 12:02 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Poweruser/ Experte

avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 49.479
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
Neuer Beitrag 05.10.2008 12:39 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Tachyon Tachyon ist männlich
myCSharp.de-Mitglied

avatar-2846.jpg


Dabei seit: 17.06.2004
Beiträge: 104
Entwicklungsumgebung: VS 2005 / 2008


Tachyon ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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ß
Neuer Beitrag 05.10.2008 14:54 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Poweruser/ Experte

avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 49.479
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo Tachyon,

Zitat:
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
Neuer Beitrag 05.10.2008 15:01 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 12 Jahre.
Der letzte Beitrag ist älter als 12 Jahre.
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 24.10.2020 19:31