Navigation

Sets (Beta) - .NET SDK

On this page

  • Overview
  • Set Types
  • Usage Example
  • Data Binding

New in version 10.2.0-beta.1.

Warning

This feature is currently in beta. We encourage you to try out the feature and give feedback, but please be aware that:

  • The API may change.
  • New data types are not backwards compatible.

To add new data types via development mode, you must update the client SDK. Realm Sync client applications using older protocol versions will no longer be able to connect.

A Realm set, like the C# HashSet<>, is an implementation of ICollection<> and IEnumerable<>. It supports values of any Realm type except collections. To define a set, use a getter-only ISet<TValue> property, where TValue is any of the supported types.

Deleting an object from the database will remove it from any sets in which it existed. Therefore, a set of objects will never contain null objects. However, sets of primitive types can contain null values. If you do not want to allow null values in a set, then either use non-nullable types in the set declaration (for example, use ISet<double> instead of ISet<double?>), or add the [Required] attribute if the set contains nullable reference types, such as string or byte[].

Important
Not Supported with Sync

Local-only Realm Databases support collections of nullable (optional) values, but Sync does not.

The following code shows examples of set types:

public class Inventory : RealmObject
{
// 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; }
// For C# types that are implicitly nullable, you can
// use the [Required] attribute to prevent storing null values
[Required]
public ISet<string> RequiredStrings { get; }
}

The following code shows how to create, write to, and read from Sets.

Note

You cannot use Linq to query against a Realm Set. Instead, use a string query.

var inventory = new Inventory();
inventory.PlantSet.Add(new Plant() { Name = "Prickly Pear" });
inventory.DoubleSet.Add(123.45);
realm.Write(() =>
{
realm.Add<Inventory>(inventory);
});
// Find all Plants that have "Prickly Pear" in the name
var pricklyPear = realm.All<Inventory>()
.Filter("PlantSet.Name CONTAINS 'Prickly Pear'");
// Find all Inventory items that have at least one value in their
// IntDict that is larger than 5
var moreThan100 = realm.All<Inventory>()
.Filter("DoubleSet.@values > 100");

Like other Realm collections, ISet implements INotifyCollectionChanged, so you can use it in data-binding scenarios (for example, when watching for changes).

Give Feedback

On this page

  • Overview
  • Set Types
  • Usage Example
  • Data Binding