Array COntains

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von exc-jdbi.

    Array COntains

    Hallo zusammen,

    ich habe mal eine Frage bezüglich der Funktion .Contains() von Arrays.

    Folgender Code:

    C#-Quellcode

    1. class Program
    2. {
    3. static void Main()
    4. {
    5. Mitarbeiter[] alleMitarbeiter = new Mitarbeiter[]
    6. {
    7. new Mitarbeiter(0,"admin"),
    8. new Mitarbeiter(1, "Marvin")
    9. };
    10. if(alleMitarbeiter.Contains(...))
    11. {
    12. }
    13. }
    14. class Mitarbeiter
    15. {
    16. public int USER_ID {get; private set;}
    17. public string USER_NAME {get; set;}
    18. public Mitarbeiter(int userId, string username)
    19. {
    20. this.USER_ID = userId;
    21. this.USER_NAME = username;
    22. }
    23. }
    24. }


    Ich möchte nun mithilfe von Contains festetellen können, ob ein Mitarbeiter mit der ID xx in dem Array existiert. Wie würde es aussehen, wenn ich die selbe Funktionalität auch für den Usernamen hinterlegen würde?

    Hat Jemand von euch eine Idee?

    EDIT: Gibt es auch eine möglichkeit, dass ich bei meinem Array auch über den Username indexieren kann? Sodass ich über alleMitarbeiter[0] den Admin erhalte und über alleMitarbeiter["admin"]?

    LG Marvin

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „MarvinKleinMusic“ ()

    MarvinKleinMusic schrieb:

    EDIT: Gibt es auch eine möglichkeit, dass ich bei meinem Array auch über den Username indexieren kann? Sodass ich über alleMitarbeiter[0] den Admin erhalte und über alleMitarbeiter["admin"]?
    Dafür wirst du dir eine eigene Klasse wie MitarbeiterCollection anlegen müssen, die von List<Mitarbeiter> erbt und zwei Indizierte Properties veröffentlicht.

    Ansonsten würde ich anstatt eines Arrays eine List<Mitarbeiter> nehmen (um ehrlich zu sein, würde ich für beinahe alles List<T> nehmen) und mit den Linq-Extensions im System.Linq Namespace arbeiten. Da drin sind sehr viele nützliche Funtionen wie Where, Any, First, OrderBy, uvm. Ich würde vermuten, die gibt es auch für Arrays, bin ich mir aber nicht ganz sicher.
    @EaranMaleasi Jou.
    @MarvinKleinMusic Ersetze das Array durch eine List<T>.
    Wenn Du mit einer solchen List als Parameter ein Unterprogramm aufrufst und dort nicht explizit List-Properties verwendest, kannst Du die Prozedur mit IEnumerable<T> deklarieren und dann den Aufruf mit List<T> und Arrays durchführen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo zusammen,

    vielen Dank für eure Hilfe.

    Hier mein Lösungansatz.

    C#-Quellcode

    1. class Program
    2. {
    3. static void Main()
    4. {
    5. Mitarbeiter[] alleMitarbeiter = new Mitarbeiter[]
    6. {
    7. new Mitarbeiter(0,"admin"),
    8. new Mitarbeiter(1, "Marvin")
    9. };
    10. MitarbeiterCollection mitarbeiter = new MitarbeiterCollection(alleMitarbeiter);
    11. if (mitarbeiter.Contains("admin"))
    12. {
    13. Console.WriteLine("JA");
    14. }
    15. }
    16. class Mitarbeiter
    17. {
    18. public int USER_ID { get; private set; }
    19. public string USER_NAME { get; set; }
    20. public Mitarbeiter(int userId, string username)
    21. {
    22. this.USER_ID = userId;
    23. this.USER_NAME = username;
    24. }
    25. }
    26. class MitarbeiterCollection : List<Mitarbeiter>, IEnumerable<Mitarbeiter>
    27. {
    28. private Mitarbeiter[] Arr { get; set; }
    29. public new int Count => Arr.Length;
    30. public MitarbeiterCollection(Mitarbeiter[] mitarbeiter)
    31. {
    32. this.Arr = mitarbeiter;
    33. }
    34. public MitarbeiterCollection(List<Mitarbeiter> mitarbeiter)
    35. {
    36. this.Arr = mitarbeiter.ToArray();
    37. }
    38. public bool Contains(string username)
    39. {
    40. for (int i = 0; i < Arr.Length; i++)
    41. {
    42. if (Arr[i].USER_NAME.ToUpper() == username.ToUpper())
    43. return true;
    44. }
    45. return false;
    46. }
    47. public bool Contains(int user_id)
    48. {
    49. for (int i = 0; i < Arr.Length; i++)
    50. {
    51. if (Arr[i].USER_ID == user_id)
    52. return true;
    53. }
    54. return false;
    55. }
    56. public Mitarbeiter this[string username]
    57. {
    58. get
    59. {
    60. for (int i = 0; i < Arr.Length; i++)
    61. {
    62. if (Arr[i].USER_NAME == username)
    63. return Arr[i];
    64. }
    65. return null;
    66. }
    67. }
    68. public IEnumerator GetEnumerator() => Arr.GetEnumerator();
    69. IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
    70. }
    71. }


    Zusätzliche Info: das implementieren der Schnittstelle IEnumerable<Mitarbeiter> sorgt dafür, dass die MitarbeiterCollection auch mithilfe von foreach durchlaufen werden kann.
    public IEnumerator GetEnumerator() => Arr.GetEnumerator(); IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
    Pfeil-Rücken-Brust-Auge?
    Ich hab's zwar nicht so mit C#, aber mal n Anfangsgegenvorschlag:

    C#-Quellcode

    1. class Program
    2. {
    3. Mitarbeiter[] alleMitarbeiter = null;
    4. public void Main()
    5. {
    6. alleMitarbeiter = new Mitarbeiter[]
    7. {
    8. new Mitarbeiter(0,"admin"),
    9. new Mitarbeiter(1, "Marvin")
    10. };
    11. }
    12. public bool Contains(int ID)
    13. {
    14. return alleMitarbeiter.Any(c => c.USER_ID == ID);
    15. }
    16. public bool Contains(string Name)
    17. {
    18. return alleMitarbeiter.Any(c => c.USER_NAME == Name);
    19. }
    20. class Mitarbeiter
    21. {
    22. public int USER_ID { get; private set; }
    23. public string USER_NAME { get; set; }
    24. public Mitarbeiter(int userId, string username)
    25. {
    26. this.USER_ID = userId;
    27. this.USER_NAME = username;
    28. }
    29. }
    30. }


    ##########

    Zeile#5 und #7 ausgebessert
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VaporiZed“ ()

    @MarvinKleinMusic
    Im Prinzip könnte man das auch mit einer ListOfString lösen.

    Muss den die Kombination von Index und Name zusammen sein. Reicht es nicht, wenn du den Index dem Array oder der ListOfT überlässt.

    Hier ein Vorschlag. ein Name der Vorhanden ist, kann nicht zweimal aufgenommen werden da Unique.
    Vb.Net

    VB.NET-Quellcode

    1. Option Strict On
    2. Option Explicit On
    3. Public Module ArrayContains
    4. Public Sub Main()
    5. Dim ListMitarbeiters = New List(Of String)
    6. ListMitarbeiters.Add("Admin")
    7. ListMitarbeiters.Add("Marvin")
    8. 'Entspricht ungefähr dem, nur das hier Name-Unique
    9. 'besteht
    10. Dim ListMitarbeiters2 = New Mitarbeiter
    11. If ListMitarbeiters2.Contain("MArvin") Then
    12. Stop
    13. End If
    14. ListMitarbeiters2.Add("Admin")
    15. ListMitarbeiters2.Add("Marvin")
    16. ListMitarbeiters2.Add("AdMin")
    17. If ListMitarbeiters2.Contain("AdMin") Then
    18. If ListMitarbeiters2.Contain("MArvin") Then
    19. Stop
    20. End If
    21. End If
    22. End Sub
    23. End Module
    24. Public Class Mitarbeiter
    25. Public ReadOnly Property Count As Int32
    26. Get
    27. If Me.Mitarbeiters IsNot Nothing Then
    28. Return Me.Mitarbeiters.Count
    29. End If
    30. Return -1
    31. End Get
    32. End Property
    33. Private ReadOnly Mitarbeiters As List(Of String)
    34. Public Function Contain(name As String) As Boolean
    35. If Me.Mitarbeiters.Contains(name.ToLower) Then
    36. Me.PrintOut(Me.IndexOf(name), name)
    37. Return True
    38. End If
    39. Return False
    40. End Function
    41. Public Function Contain(id As Int32) As Boolean
    42. Return Me.Mitarbeiters.Count < id
    43. End Function
    44. Public Function IndexOf(name As String) As Int32
    45. Return Me.Mitarbeiters.IndexOf(name.ToLower)
    46. End Function
    47. Public Function GetIndex(id As Int32) As String
    48. If Me.Mitarbeiters.Count > id Then Return Me.Mitarbeiters(id)
    49. Return Nothing
    50. End Function
    51. Public Sub Add(name As String)
    52. If String.IsNullOrEmpty(name) Then Throw New ArgumentException("name")
    53. If Me.Mitarbeiters.Count > 0 Then
    54. If Not Me.Contain(name.ToLower) Then Me.Mitarbeiters.Add(name.ToLower)
    55. Else Me.Mitarbeiters.Add(name.ToLower)
    56. End If
    57. End Sub
    58. Private Sub PrintOut(id As Int32, name As String)
    59. Console.WriteLine("Id = {0}; Name = {1} exist", id, name)
    60. End Sub
    61. Public Sub New()
    62. Me.Mitarbeiters = New List(Of String)
    63. End Sub
    64. End Class

    CSharp

    C#-Quellcode

    1. public class Mitarbeiter
    2. {
    3. public Int32 Count
    4. {
    5. get
    6. {
    7. if (this.Mitarbeiters != null)
    8. return this.Mitarbeiters.Count;
    9. return -1;
    10. }
    11. }
    12. private readonly List<string> Mitarbeiters;
    13. public bool Contain(string name)
    14. {
    15. if (this.Mitarbeiters.Contains(name.ToLower()))
    16. {
    17. this.PrintOut(this.IndexOf(name), name);
    18. return true;
    19. }
    20. return false;
    21. }
    22. public bool Contain(Int32 id)
    23. {
    24. return this.Mitarbeiters.Count < id;
    25. }
    26. public Int32 IndexOf(string name)
    27. {
    28. return this.Mitarbeiters.IndexOf(name.ToLower());
    29. }
    30. public string GetIndex(Int32 id)
    31. {
    32. if (this.Mitarbeiters.Count > id)
    33. return this.Mitarbeiters[id];
    34. return null;
    35. }
    36. public void Add(string name)
    37. {
    38. if (string.IsNullOrEmpty(name))
    39. throw new ArgumentException("name");
    40. if (this.Mitarbeiters.Count > 0)
    41. {
    42. if (!this.Contain(name.ToLower()))
    43. this.Mitarbeiters.Add(name.ToLower());
    44. }
    45. else
    46. this.Mitarbeiters.Add(name.ToLower());
    47. }
    48. private void PrintOut(Int32 id, string name)
    49. {
    50. Console.WriteLine("Id = {0}; Name = {1} exist", id, name);
    51. }
    52. public Mitarbeiter()
    53. {
    54. this.Mitarbeiters = new List<string>();
    55. }
    56. }

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „exc-jdbi“ ()