.NET Framework Class Library
SortedSet<(Of <(T>)>) Class

[This documentation is for preview only, and is subject to change in later releases. Blank topics are included as placeholders.]

Represents a collection of objects that is maintained in sorted order.

Namespace:  System.Collections.Generic
Assembly:  System (in System.dll)
Syntax

Visual Basic (Declaration)
<SerializableAttribute> _
Public Class SortedSet(Of T) _
    Implements ISet(Of T), ICollection(Of T),  _
    IEnumerable(Of T), ICollection, IEnumerable, ISerializable, IDeserializationCallback
Visual Basic (Usage)
Dim instance As SortedSet(Of T)
C#
[SerializableAttribute]
public class SortedSet<T> : ISet<T>, 
    ICollection<T>, IEnumerable<T>, ICollection, IEnumerable, ISerializable, 
    IDeserializationCallback
Visual C++
[SerializableAttribute]
generic<typename T>
public ref class SortedSet : ISet<T>, 
    ICollection<T>, IEnumerable<T>, ICollection, IEnumerable, ISerializable, 
    IDeserializationCallback
F#
[<SerializableAttribute>]
type SortedSet<'T> =  
    class
        interface ISet<'T>
        interface ICollection<'T>
        interface IEnumerable<'T>
        interface ICollection
        interface IEnumerable
        interface ISerializable
        interface IDeserializationCallback
    end

Type Parameters

T

The type of elements in the set.

Remarks

A SortedSet<(Of <(T>)>) maintains a sorted order as elements are inserted and deleted without affecting performance. Duplicate elements are not allowed.

Examples

The following example demonstrates a SortedSet<(Of <(T>)>) class that is created with the constructor that takes an IComparer<(Of <(T>)>) as a parameter. This comparer (ByFileExtension) is used to sort a list of file names by their extensions.

This example demonstrates how to create a sorted set of media file names, remove unwanted elements, view a range of elements, and compare the set with another sorted set.

Visual Basic
Imports System.Collections
Imports System.Collections.Generic
Imports System.IO

Module Module1

    Sub Main()
        Try
            ' Get a list of the files to use for the sorted set.
            Dim files1 As IEnumerable = _
                Directory.EnumerateFiles("\\archives\2007\media", "*", _
                                                          SearchOption.AllDirectories)
            ' Create a sorted set using the ByFileExtension comparer.
            Dim mediaFiles1 As SortedSet(Of String) = _
                New SortedSet(Of String)(New ByFileExtension)

            ' Note that there is a SortedSet constructor that takes an IEnumerable,
            ' but to remove the path information they must be added individually.
            For Each f As String In files1
                mediaFiles1.Add(f.Substring((f.LastIndexOf("\") + 1)))
            Next

            ' Remove elements that have non-media extensions. See the 'isDoc' method.
            Console.WriteLine("Remove docs from the set...")
            Console.WriteLine(vbTab & "Count before: {0}", mediaFiles1.Count.ToString)
            mediaFiles1.RemoveWhere(AddressOf isDoc)
            Console.WriteLine(vbTab & "Count after: {0}", mediaFiles1.Count.ToString)

            Console.WriteLine()

            ' List all the avi files.
            Dim aviFiles As SortedSet(Of String) = mediaFiles1.GetViewBetween("avi", "avj")
            Console.WriteLine("AVI files:")
            For Each avi As String In aviFiles
                Console.WriteLine(vbTab & "{0}", avi)
            Next

            Console.WriteLine()

            ' Create another sorted set.
            Dim files2 As IEnumerable = _
                Directory.EnumerateFiles("\\archives\2008\media", "*", _
                                      SearchOption.AllDirectories)
            Dim mediaFiles2 As SortedSet(Of String) = _
                New SortedSet(Of String)(New ByFileExtension)
            For Each f As String In files2
                mediaFiles2.Add(f.Substring((f.LastIndexOf("\") + 1)))
            Next

            ' Remove elements in mediaFiles1 that are also in mediaFiles2.
            Console.WriteLine("Remove duplicates (of mediaFiles2) from the set...")
            Console.WriteLine(vbTab & "Count before: {0}", _
                    mediaFiles1.Count.ToString)
            mediaFiles1.ExceptWith(mediaFiles2)
            Console.WriteLine(vbTab & "Count after: {0}", _
                    mediaFiles1.Count.ToString)

            Console.WriteLine()

            Console.WriteLine("List of mediaFiles1:")
            For Each f As String In mediaFiles1
                Console.WriteLine(vbTab & "{0}", f)
            Next

            ' Create a set of the sets.
            Dim comparer As IEqualityComparer(Of SortedSet(Of String)) = _
                SortedSet(Of String).CreateSetComparer()
            Dim allMedia As HashSet(Of SortedSet(Of String)) = _
                    New HashSet(Of SortedSet(Of String))(comparer)
            allMedia.Add(mediaFiles1)
            allMedia.Add(mediaFiles2)

        Catch ioEx As IOException
            Console.WriteLine(ioEx.Message)
        Catch AuthEx As UnauthorizedAccessException
            Console.WriteLine(AuthEx.Message)
        End Try


    End Sub

    ' Defines a predicate deligate to use
    ' for the SortedSet.RemoveWhere method.
    Private Function isDoc(ByVal s As String) As Boolean
        If (s.ToLower.EndsWith(".txt") _
                    OrElse (s.ToLower.EndsWith(".doc") _
                    OrElse (s.ToLower.EndsWith(".xls") _
                    OrElse (s.ToLower.EndsWith(".xlsx") _
                    OrElse (s.ToLower.EndsWith(".pdf") _
                    OrElse (s.ToLower.EndsWith(".doc") _
                    OrElse s.ToLower.EndsWith(".docx"))))))) Then
            Return True
        Else
            Return False
        End If
    End Function

    ' Defines a comparer to create a sorted set
    ' that is sorted by the file extensions.
    Public Class ByFileExtension
        Implements IComparer(Of String)
        Dim xExt, yExt As String

        Dim caseiComp As CaseInsensitiveComparer = _
                            New CaseInsensitiveComparer
        Public Function Compare(ByVal x As String, ByVal y As String) _
                                                                As Integer
            ' Parse the extension from the file name. 
            xExt = x.Substring(x.LastIndexOf(".") + 1)
            yExt = y.Substring(y.LastIndexOf(".") + 1)

            ' Compare the file extensions. 
            Dim vExt As Integer = caseiComp.Compare(xExt, yExt)
            If vExt <> 0 Then
                Return vExt
            Else
                ' The extension is the same, 
                ' so compare the filenames. 
                Return caseiComp.Compare(x, y)
            End If
        End Function        

    End Class
End Module
C#
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;


class Program
{
    static void Main(string[] args)
    {
        try
        {
            // Get a list of the files to use for the sorted set.
            IEnumerable<string> files1 =
                Directory.EnumerateFiles(@"\\archives\2007\media",
                "*", SearchOption.AllDirectories);

            // Create a sorted set using the ByFileExtension comparer.
            SortedSet<string> mediaFiles1 =
                new SortedSet<string>(new ByFileExtension());

            // Note that there is a SortedSet constructor that takes an IEnumerable,
            // but to remove the path information they must be added individually.
            foreach (string f in files1)
            {
                mediaFiles1.Add(f.Substring(f.LastIndexOf(@"\") + 1));
            }

            // Remove elements that have non-media extensions.
            // See the 'isDoc' method.
            Console.WriteLine("Remove docs from the set...");
            Console.WriteLine("\tCount before: {0}", mediaFiles1.Count.ToString());
            mediaFiles1.RemoveWhere(isDoc);
            Console.WriteLine("\tCount after: {0}", mediaFiles1.Count.ToString());


            Console.WriteLine();

            // List all the avi files.
            SortedSet<string> aviFiles = mediaFiles1.GetViewBetween("avi", "avj");

            Console.WriteLine("AVI files:");
            foreach (string avi in aviFiles)
            {
                Console.WriteLine("\t{0}", avi);
            }

            Console.WriteLine();

            // Create another sorted set.
            IEnumerable<string> files2 =
                Directory.EnumerateFiles(@"\\archives\2008\media",
                    "*", SearchOption.AllDirectories);

            SortedSet<string> mediaFiles2 = new SortedSet<string>(new ByFileExtension());

            foreach (string f in files2)
            {
                mediaFiles2.Add(f.Substring(f.LastIndexOf(@"\") + 1));
            }

            // Remove elements in mediaFiles1 that are also in mediaFiles2.
            Console.WriteLine("Remove duplicates (of mediaFiles2) from the set...");
            Console.WriteLine("\tCount before: {0}", mediaFiles1.Count.ToString());
            mediaFiles1.ExceptWith(mediaFiles2);
            Console.WriteLine("\tCount after: {0}", mediaFiles1.Count.ToString());

            Console.WriteLine();

            Console.WriteLine("List of mediaFiles1:");
            foreach (string f in mediaFiles1)
            {
                Console.WriteLine("\t{0}",f);
            }

            // Create a set of the sets.
            IEqualityComparer<SortedSet<string>> comparer =
                SortedSet<string>.CreateSetComparer();

            HashSet<SortedSet<string>> allMedia =
                new HashSet<SortedSet<string>>(comparer);
            allMedia.Add(mediaFiles1);
            allMedia.Add(mediaFiles2);
        }
        catch(IOException ioEx)
        {
            Console.WriteLine(ioEx.Message);
        }

        catch (UnauthorizedAccessException AuthEx)
        {
            Console.WriteLine(AuthEx.Message);

        }
    }

    // Defines a predicate delegate to use
    // for the SortedSet.RemoveWhere method.
    private static bool isDoc(string s)
    {
        if (s.ToLower().EndsWith(".txt") ||
            s.ToLower().EndsWith(".doc") ||
            s.ToLower().EndsWith(".xls") ||
            s.ToLower().EndsWith(".xlsx") ||
            s.ToLower().EndsWith(".pdf") ||
            s.ToLower().EndsWith(".doc") ||
            s.ToLower().EndsWith(".docx"))
        {
            return true;
        }
        else
        {
            return false;
        }
    }


}

// Defines a comparer to create a sorted set
// that is sorted by the file extensions.
public class ByFileExtension : IComparer<string>
{
    string xExt, yExt;

    CaseInsensitiveComparer caseiComp = new CaseInsensitiveComparer();

    public int Compare(string x, string y)
    {
        // Parse the extension from the file name. 
        xExt = x.Substring(x.LastIndexOf(".") + 1);
        yExt = y.Substring(y.LastIndexOf(".") + 1);

        // Compare the file extensions. 
        int vExt = caseiComp.Compare(xExt, yExt);
        if (vExt != 0)
        {
            return vExt;
        }
        else
        {
            // The extension is the same, 
            // so compare the filenames. 
            return caseiComp.Compare(x, y);
        }
    }
}
Inheritance Hierarchy

System..::.Object
  System.Collections.Generic..::.SortedSet<(Of <(T>)>)
Thread Safety

Any public static (Shared in Visual Basic) members of this type are thread safe. Any instance members are not guaranteed to be thread safe.
Platforms

Windows 7, Windows Vista, Windows XP SP2, Windows Server 2008, Windows Server 2003

The .NET Framework and .NET Compact Framework do not support all versions of every platform. For a list of the supported versions, see .NET Framework System Requirements.
Version Information

.NET Framework

Supported in: 4

.NET Framework Client Profile

Supported in: 4
See Also

Reference

Page view tracker