Novidades na versão 10.2.0.
Visão geral
Um conjunto de Realm , como o C# HashSet<>, é uma implementação de ICollection <> e IEnumerable <>. Ele suporta valores de qualquer tipo de Realm , exceto coleções. Para definir um conjunto, utilize uma ISet<TValue> propriedade somente para iniciar, onde TValue é qualquer um dos tipos suportados.
Excluir um objeto do reconhecimento de data center o removerá de todos os conjuntos em que ele estava presente. Portanto, um conjunto de objetos nunca conterá objetos nulos. No entanto, conjuntos de tipos primitivos podem conter valores nulos. Se você não quiser permitir valores nulos em um conjunto, use tipos não anuláveis na declaração do conjunto (por exemplo, use ISet<double> em vez de ISet<double?>). Se você estiver usando a definição do tipo de esquema mais antigo (suas classes derivam da classe base do RealmObject ) ou você não tiver a anulabilidade habilitada, você precisará usar o atributo [Required] se o conjunto contiver tipos de referência anuláveis, como string ou byte[].
Importante
Não suportado com a sincronização
Os domínios somente locais oferecem suporte a collections de valores anuláveis (opcional), mas o Sync não.
Definir tipos
O seguinte código mostra exemplos de tipos de conjunto:
public partial class Inventory : IRealmObject { // A Set can contain any Realm-supported type, including // objects that inherit from RealmObject public ISet<Plant> PlantSet { get; } public ISet<double> DoubleSet { get; } // Nullable types are supported in local-only // Realms, but not with Sync public ISet<int?> NullableIntsSet { get; } public ISet<string> RequiredStrings { get; } }
Exemplo de uso
O código a seguir mostra como criar, gravar e ler a partir de Conjuntos.
var inventory = new Inventory(); inventory.PlantSet.Add(new Plant() { Name = "Prickly Pear" }); inventory.DoubleSet.Add(123.45); realm.Write(() => { realm.Add<Inventory>(inventory); }); // convert the Plant Set to an IQueryable and apply a filter var pricklyPear = inventory.PlantSet.AsRealmQueryable() .Where(p => p.Name == "Prickly Pear"); // Alternatively, apply a filter directly on the Plant Set var pricklyPearPlants = inventory.PlantSet .Filter("Name == 'Prickly Pear'"); // Find all Inventory items that have at least one value in their // DoubleSet that is larger than 5 var moreThan100 = realm.All<Inventory>() .Filter("DoubleSet.@values > 100");
Atento às mudanças
Você pode usar o evento INotifyCollectionChanged.CollectionChanged em um conjunto para observar as alterações no conjunto, e o evento INotifyPropertyChanged.PropertyChanged para observar as alterações em propriedades específicas do conjunto.
No seguinte exemplo de código, temos uma classe com uma propriedade ISet<string> denominada StringSet. Criamos manipuladores de eventos para os eventos CollectionChanged e PropertyChanged:
var stringSet = container.StringSet.AsRealmCollection(); stringSet.CollectionChanged += (sender, e) => { Console.WriteLine($"Set {sender} changed: {e.Action}"); }; stringSet.PropertyChanged += (sender, e) => { Console.WriteLine($"Property changed on {sender}: {e.PropertyName}"); };