C-Sharp | Java | Python | Swift | GO | WPF | Ruby | Scala | F# | JavaScript | SQL | PHP | Angular | HTML
Tip: In the ReadOnlyCollection constructor, no elements are copied. The constructor is fast.
ConstructorLoops: You can loop over the ReadOnlyCollection using the foreach-loop. A for-loop is also possible with the Count property and indexer.
CopyTo: CopyTo provides a way to copy the elements to an array. You must allocate the array yourself.
Finally: We see the Count, Contains, and IndexOf methods. These have the same functionality as the equivalent methods on the List type.
ListList ContainsC# program that uses ReadOnlyCollection
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
class Program
{
static void Main()
{
List<int> list = new List<int>();
list.Add(1);
list.Add(3);
list.Add(5);
// Constructor.
ReadOnlyCollection<int> read = new ReadOnlyCollection<int>(list);
// Loop over ReadOnlyCollection.
foreach (int value in read)
{
Console.WriteLine("read: {0}", value);
}
// Copy ReadOnlyCollection to an array.
int[] array = new int[3];
read.CopyTo(array, 0);
// Display array.
foreach (int value in array)
{
Console.WriteLine("array: {0}", value);
}
// Use methods on ReadOnlyCollection.
int count = read.Count;
bool contains = read.Contains(-1);
int index = read.IndexOf(3);
Console.WriteLine("{0}, {1}, {2}", count, contains, index);
}
}
Output
read: 1
read: 3
read: 5
array: 1
array: 3
array: 5
3, False, 1
And: On the other hand, let's say you have a ReadOnlyCollection(StringBuilder). This is kind of a strange thing to have, but it is acceptable.
Tip: You can still change the individual StringBuilder objects by accessing their methods.
Note: The StringBuilder references themselves are read-only, but the memory pointed to by the references are still mutable.
StringBuilderC# program that changes object in ReadOnlyCollection
using System;
using System.Collections.ObjectModel;
using System.Text;
class Program
{
static void Main()
{
// Set up the ReadOnlyCollection.
StringBuilder[] array = new StringBuilder[1];
array[0] = new StringBuilder();
var read = new ReadOnlyCollection<StringBuilder>(array);
// Now we change an object pointed to in a ReadOnlyCollection.
read[0].Append("Dot").Append("Net").Append("Perls");
Console.WriteLine(read[0]);
}
}
Output
DotNetPerls