.Contains gibt falschen Wert zurück?
- VB.NET
- .NET (FX) 4.0
Sie verwenden einen veralteten Browser (%browser%) mit Sicherheitsschwachstellen und können nicht alle Funktionen dieser Webseite nutzen.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.
-
-
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. -
In diesem Fall wird geprüft ob die Liste genau diese (nicht irgendeine mit identischen Werten) Instanz dieser Klasse beinhaltet. Ist es eine andere Instanz, so gibt dir dir Funktion richtigerweise false zurück."Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."
Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
Wie man VisualStudio nutzt? => VisualStudio richtig nutzen -
Es ist hilfreich für sowas
IEquatable<T>
(Doc) in deiner KlasseStandortSelection
zu implementieren. -
@tragl
Schaue dir das in Anlehnung meines Vorposters an...
tutorialsteacher.com/linq/linq-quantifier-operator-contains -
@mrMo @ISliceUrPanties
danke, es lag an den verschiedenen Instanzen.
Hab meine Klasse nu' wie folgt gebaut, jetzt läufts - da muss man ja erstma drauf kommen
VB.NET-Quellcode
- Public Class StandortSelection
- Implements IEquatable(Of StandortSelection) 'notwendig, damit diverse Instanzen miteinander verglichen werden können
- Property rwStandort As StandortRow
- Property GesellschaftAndStandortName As String
- Public Overloads Function Equals(ByVal other As StandortSelection) As Boolean Implements IEquatable(Of StandortSelection).Equals
- Return other.rwStandort Is Me.rwStandort AndAlso other.GesellschaftAndStandortName = Me.GesellschaftAndStandortName
- End Function
- End Class
"Na, wie ist das Wetter bei dir?"
"Caps Lock."
"Hä?"
"Shift ohne Ende!" -
poste mal die Klasse
StandortSelection
(wenns ühaupt eine Klasse ist).
Wahrscheinlich kannsteIEquatable<T>
auch vermeiden - das zieht nämlich einen Rattenschwanz an weiteren zu implementierenden Interfaces nach sich.
Etwa durch geeignete Verwendung von Linq-.Any(Selector)
- Extension.
Evtl. ist der Fehler auch, dass du unzulässigerweise mehrereStandortSelection
-Objekte erzeugst.
Dann wäre wohl besser das zu fixen, statt anderer Workarounds.
Edit: Ah, du bist jetzt auf IEquatable.
So, wie du's gemacht hast, wird das Fehlverhalten erzeugen, wenn du diese Klasse mal in einem Dictionary als Key verwendest.
Und was mit Linq passiert ist auch unvorhersehbar, viele Linq-Extensions arbeiten intern mit Dictionaries/Hashsets.
Diese PropertyGesellschaftAndStandortName
- wäre da nicht besser, die würde ihren Wert direkt aus der enthaltenen StandortRow berechnen, oder geht das nicht?
Auch glaube ich, es täte reichen, nurGesellschaftAndStandortName
zum Vergleich heranzuziehen.
Und, wie gesagt: prüfe auch, ob der Fehler nicht darin liegt, dass da mehrere Instanzen erstellt werden, wo man besser nur eine einzige wiederverwenden sollte.
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()
-
other.rwStandort Is Me.rwStandort
prüft auch ob es sich um die gleiche Instanz handelt und nicht ob die Werte an sich identisch sind. Also eigentlich nicht das was du willst. Deine Prüfung klappt (in diesem Fall) nur weil zusätzlich GesellschaftAndStandortName verglichen wird, was vermutlich ein String ist."Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."
Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
Wie man VisualStudio nutzt? => VisualStudio richtig nutzen -
@ErfinderDesRades:
Die Klasse hatte ich ja oben gepostet.
Folgende "Problemstellung":
Auf einer Form deklariere ichPrivate _standorte As New List(Of StandortSelection)
Dann mit_standorte = StandortSelect(_appMod, _standorte)
weiter.
Dann will ich über eine CheckedListBox mir Daten der Standorte anzeigen lassen. ->rwStandort.GesellschaftRow.Name | rwStandort.Name
Mein Problem ist der DisplayMember Zeile16 - deshalb hab ich mir die beiden Strings da zusammengehäkelt. Wenn ihr eine stilvollere Lösung habt, dann gerne.
Ich brauch die AnzeigeGesellschaft | Name
und die Selektion der CheckedListBox muss die jeweiligerwStandort
ergeben.
VB.NET-Quellcode
- ''' <summary> Zeigt eine CheckedListBox mit allen Standorten anhand UserRechten an und Returnt eine Liste mit Standort-Strings </summary>
- Public Function StandortSelect(appMod As String, standortList As List(Of StandortSelection)) As List(Of StandortSelection)
- Dim AllStandort As New List(Of StandortSelection)
- Dim SelectedStandort As New List(Of StandortSelection)
- Dim gesellschaften = GetGesellschaft(appMod)
- If gesellschaften Is Nothing Then Return Nothing
- For Each rwGesellschaft In gesellschaften
- Dim standorte = GetStandort(appMod, rwGesellschaft)
- For Each rwStandort In standorte
- AllStandort.Add(New StandortSelection With {.rwStandort = rwStandort, .GesellschaftAndStandortName = $"{rwStandort.GesellschaftRow.Name} | {rwStandort.Name}"})
- Next
- Next
- Using dlg As New dlgChkLb
- dlg.Text = "Standort(e) auswählen"
- dlg.chkLb.DataSource = AllStandort
- dlg.chkLb.DisplayMember = "GesellschaftAndStandortName"
- dlg.chkLb.ValueMember = "rwStandort"
- For i = 0 To dlg.chkLb.Items.Count - 1
- Dim itm = DirectCast(dlg.chkLb.Items(i), StandortSelection)
- If standortList Is Nothing OrElse standortList.Count = 0 Then 'Wenn noch keine Selektion vorhanden, dann alle markieren
- dlg.chkLb.SetItemChecked(i, True)
- Else 'vorherige Selektion wiederherstellen
- If standortList.Contains(itm) Then dlg.chkLb.SetItemChecked(i, True)
- End If
- Next
- If dlg.ShowDialog() <> DialogResult.OK Then Return Nothing
- For Each itm In dlg.chkLb.CheckedItems
- SelectedStandort.Add(DirectCast(itm, StandortSelection))
- Next
- End Using
- If SelectedStandort.Count = 0 Then Return Nothing
- Return SelectedStandort
- End Function
Hier nochmal die Klasse:
VB.NET-Quellcode
- Public Class StandortSelection
- Implements IEquatable(Of StandortSelection) 'notwendig, damit diverse Instanzen miteinander verglichen werden können
- Property rwStandort As StandortRow
- Property GesellschaftAndStandortName As String
- Public Overloads Function Equals(ByVal other As StandortSelection) As Boolean Implements IEquatable(Of StandortSelection).Equals
- Return other.rwStandort Is Me.rwStandort AndAlso other.GesellschaftAndStandortName = Me.GesellschaftAndStandortName
- End Function
- End Class
@mrMo: nicht ganz, dieStandortRow
(rwStandort) bleibt ja die selbe, unabhängig von der Instanz
"Na, wie ist das Wetter bei dir?"
"Caps Lock."
"Hä?"
"Shift ohne Ende!"Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „tragl“ ()
-
ich könnt mir vorstellen, die ganze Klasse
StandortSelection
kann weg.
Du kannst an der KlasseStandortRow
eineReadonly Property GesellschaftAndStandortName
dranprogrammieren - dann kannste gleich mitStandortRow
arbeiten, und dann geht das mit.Contains()
auch wieder so wie du ursprünglich dachtetest. -
ErfinderDesRades schrieb:
dranprogrammieren
Wenn du mir sagst wie, dann probier' ich das gerne. Ist ja eine generierte Klasse vom typDataSet.
"Na, wie ist das Wetter bei dir?"
"Caps Lock."
"Hä?"
"Shift ohne Ende!" -
Ich leg da ja immer einen Dataset-Ordner an, und für Erweiterungen dann Erweiterungs-Dateien, meist mit mehreren Erweiterungs-Klassen drin, weil das meist nicht so viel Code ist - je Klasse.
Also deine DateidtsLogistikTool.Logic.vb
könnte (neben dem, was eh schon drin ist) noch sowas enthalten:
Aber eiglich dachte ich, du kenntest das schon, weil in meiner Version deines Werks finde ich bereits diese beiden Partial-Erweiterungen vor:VB.NET-Quellcode
- Partial Class dtsLogistik
- Partial Class TreeDataTable
- Private Sub TreeDataTable_ColumnChanged(sender As Object, e As DataColumnChangeEventArgs) Handles Me.ColumnChanged
- If e.Column IsNot NrColumn Then Return
- Dim rw = DirectCast(e.Row, TreeRow)
- rw.SortKey = GetTocSortKey(rw.Nr)
- End Sub
- End Class 'TreeDataTable
- Partial Class TreeRow
- Public Overrides Function ToString() As String ' Debugging-Hilfe: Im Haltemodus zeigt der Debugger nun die signifikante Eigenschaft der TreeRow
- Return Nr
- End Function
- End Class 'TreeRow
- End Class
Oder war ich das selber, der das drangebastelt hat?
Nee, aber ist glaub schon sehr lange her, dass wir das verzapft haben.
Jedenfalls das Prinzip heisst: "Erweiterung generierten Codes mittels Partialer Klasse" - und ist was ganz anderes als die Erweiterungen, die man mittels Extension-Methods bewerkstelligt.
Vielleicht das SchlüsselwortPartial
recherchieren - (ist eiglich simpel: Man kann den Code einer Klasse auf mehrere Dateien aufteilen.)
-
ErfinderDesRades schrieb:
Ist ja dasselbe Prinzip.
jo, macht absolut Sinn - bin ich mal wieder nicht drauf gekommen
Teste ich am Wochenende mal -wird bestimmt klappen, wie immer"Na, wie ist das Wetter bei dir?"
"Caps Lock."
"Hä?"
"Shift ohne Ende!" -
ErfinderDesRades schrieb:
könnte (neben dem, was eh schon drin ist) noch sowas enthalten:
Hi, könnte ich mit sowas auch die Expressioned-Columns aus dem Designer "ersetzen"? also quasi die hinzugefügte Property auch im DGV als Column nutzen?
Ansich mag ich die Expressioned-Columns schon, ist aber halt bescheiden wenn die vom Desginer zurückgesetzt werden wenn man da große Änderungen macht. Codeseitig wär' mir sowas lieber und am sinnvollsten
dann eben in der Businesslogik"Na, wie ist das Wetter bei dir?"
"Caps Lock."
"Hä?"
"Shift ohne Ende!" -
-
ErfinderDesRades schrieb:
Nein - da gibts ein Fehl-Design beim Databinding
Schade.. hätt' ja klappen können
Aber:
Angenommen ich lass die expression-Cols weg und nutze trotzdem die Property. Wäre es dann weniger Performant manuell eine Col einem DGV hinzuzufügen und über z.B.
das RowPrepaint-Event die Property in dieser Col anzuzeigen? Also wäre eine direkte expression (kommt mit einem rutsch über die Bindingsource an's DGV) schneller als der von mir
angedachte weg?"Na, wie ist das Wetter bei dir?"
"Caps Lock."
"Hä?"
"Shift ohne Ende!" -
Weiss ich nicht.
Expressions machen iwas geheimnisvolles, aber jeder typProperty-Abruf macht ja auch was komisches.
Daher wäre das vielleicht mal wert, ein paar Benchmarks damit laufen zu lassen.
Generell ist das mit manuelle Properties bischen anständiger, weil der Compiler sichert die Syntax.
Expressions sind ja im Ursprung beliebige Text-Werte (die evtl. kompiliert werden, vlt. auch nicht, vlt. werden Ergebnisse gecachet,...) - jedenfalls bei bestimmten Änderungen sind DataExpressions für Überraschungen gut - weisste ja.
-
Benutzer online 1
1 Besucher
-
Ähnliche Themen
-
6 Benutzer haben hier geschrieben
- tragl (7)
- ErfinderDesRades (5)
- mrMo (2)
- VB1963 (1)
- VaporiZed (1)
- ISliceUrPanties (1)