-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathMappedCollectionDecorator.cs
More file actions
90 lines (56 loc) · 2.39 KB
/
MappedCollectionDecorator.cs
File metadata and controls
90 lines (56 loc) · 2.39 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
namespace Gsemac.Collections {
public sealed class MappedCollectionDecorator<ItemT, SubItemT> :
ICollection<SubItemT> {
// Public members
public int Count => underlyingCollection.Count;
public bool IsReadOnly => underlyingCollection.IsReadOnly;
public MappedCollectionDecorator(ICollection<ItemT> underlyingCollection, Func<ItemT, SubItemT> toSubItem, Func<SubItemT, ItemT> fromSubItem) {
if (underlyingCollection is null)
throw new ArgumentNullException(nameof(underlyingCollection));
if (toSubItem is null)
throw new ArgumentNullException(nameof(toSubItem));
if (fromSubItem is null)
throw new ArgumentNullException(nameof(fromSubItem));
this.underlyingCollection = underlyingCollection;
this.toSubItem = toSubItem;
this.fromSubItem = fromSubItem;
}
public void Add(SubItemT item) {
underlyingCollection.Add(fromSubItem(item));
}
public bool Contains(SubItemT item) {
return underlyingCollection.Any(i => toSubItem(i)?.Equals(item) ?? false);
}
public bool Remove(SubItemT item) {
ItemT itemToRemove = underlyingCollection.Where(i => toSubItem(i)?.Equals(item) ?? false)
.FirstOrDefault();
if (itemToRemove.Equals(default))
return false;
return underlyingCollection.Remove(itemToRemove);
}
public void Clear() {
underlyingCollection.Clear();
}
public void CopyTo(SubItemT[] array, int arrayIndex) {
underlyingCollection.Select(i => toSubItem(i))
.ToArray()
.CopyTo(array, arrayIndex);
}
public IEnumerator<SubItemT> GetEnumerator() {
return (IEnumerator<SubItemT>)underlyingCollection.Select(i => toSubItem(i))
.ToArray()
.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator() {
return GetEnumerator();
}
// Private members
private readonly ICollection<ItemT> underlyingCollection;
private readonly Func<ItemT, SubItemT> toSubItem;
private readonly Func<SubItemT, ItemT> fromSubItem;
}
}