8

Meine EF-Modelle wie folgt aussehen:ASP.NET Entity Framework 6 HashSet oder Liste für eine Sammlung?

public class ContentStatus 
{ 
    public ContentStatus() 
    { 
     this.Contents = new List<Content>(); 
    } 

    public int ContentStatusId { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<Content> Contents { get; set; } 
} 

Allerdings habe ich auch auf der Suche gesehen implementatins dies wie:

public class ContentStatus 
{ 
    public ContentStatus() 
    { 
     this.Contents = new HashSet<Content>(); 
    } 

    public int ContentStatusId { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<Content> Contents { get; set; } 
} 

Hier ist die DDL für dieses Objekt:

CREATE TABLE [dbo].[ContentStatus] (
    [ContentStatusId] INT   NOT NULL, 
    [Name]   NVARCHAR (50) NOT NULL, 
    CONSTRAINT [PK_ContentStatus] PRIMARY KEY CLUSTERED ([ContentStatusId] ASC) 
); 

Jeder kann sag mir was ich benutzen soll oder gibt es sogar einen Unterschied und wann würde ich die Liste benutzen und wenn das HashSet wenn das zutrifft.

Dank

Antwort

0

So ein HashSet<T> ist definition

Und ein List<T> nicht über diese Fähigkeiten.

Also ich denke, es ist auf gewünschte Eigenschaften und Leistung (die auf kleinen Sets ist vernachlässigbar). Sie können beide aufgezählt werden.

Leistung (obwohl wahrscheinlich winzige Unterschiede) wird in zwei Teilen, lesen und schreiben. Wie Sean bemerkte, wird es wegen Hash-Code-Berechnungen und Eindeutigkeitsvergleiche wahrscheinlich Strafen für Schreibvorgänge geben. Aber Lesevorgänge sind extrem schnell (o(1)).

Also wirklich, es ist alles auf gewünschte Eigenschaften.

In meinen Projekten würde ich List<T> verwenden, aber das ist meine Art von Konvention. Sie können Ihre eigene Konvention festlegen, solange Sie sich daran halten.

+0

'HashSet' kann iteriert werden. Jede Klasse, die 'IEnumerable' implementiert, kann dies tun, und beide 'Listen' 'und' HashSet 'implementieren. –

+0

@XavierPoinas aktualisierte Antwort ... Gott weiß, wo ich diese Idee von ... –

+0

Ich würde davon ausgehen, dass Hashset für Einsätze teurer wäre, da es Eindeutigkeit gewährleistet und muss daher mit anderen Einträgen oder zumindest ihre Hashes vergleichen, aber weniger teuer für die Entfernung (vorausgesetzt, ein Hash findet Elemente schneller als die Aufzählungsliste). –

5

Es hängt von Ihrem Anwendungsfall ab, aber in den meisten Fällen können Sie ein Objekt nur einmal zur Sammlung hinzufügen, da beispielsweise jeder Status nur einmal auf einen Inhalt angewendet wird. Ich bezweifle, dass ein Inhalt zweimal in einem Status erscheinen kann. Daher ist HashSet die korrekte Datenstruktur, da es Duplikate verhindert. Für den Fall, dass ein Artikel dupliziert werden kann, wäre die Liste korrekt, aber ich bin in der Praxis nicht darauf gestoßen und weiß nicht einmal, wie EF damit umgehen würde.

Als eine Randnotiz würde ich empfehlen, dass Sie eine Sammlung von Elementen in Ihren Entitäten nicht enthalten, es sei denn, Sie benötigen es. Wenn Sie beispielsweise eine Web-App erstellen, um Produkte aufzulisten, haben Sie wahrscheinlich eine Ansicht, in der Sie ein einzelnes Produkt zusammen mit seinen Tags anzeigen. Daher sollte Product eine Sammlung von Tags haben, um diesen Fall einfach zu machen. Allerdings haben Sie wahrscheinlich keine Seite, auf der ein Tag mit seiner Produktgruppe angezeigt wird. Daher sollte das Tag keine Produkteigenschaft haben. Es interessiert sich einfach nicht für verwandte Produkte. Es scheint, dass diese Statuseinheit sich nicht um die Sammlung von Inhalten kümmert.

Verwandte Themen