Barotrauma Client Doc
CollectionConcat.cs
1 using System;
2 using System.Collections;
3 using System.Collections.Generic;
4 using System.Linq;
5 
6 namespace Barotrauma
7 {
8  public class CollectionConcat<T> : ICollection<T>
9  {
10  protected readonly IEnumerable<T> enumerableA;
11  protected readonly IEnumerable<T> enumerableB;
12 
13  public CollectionConcat(IEnumerable<T> a, IEnumerable<T> b)
14  {
15  enumerableA = a; enumerableB = b;
16  }
17 
18  public int Count => enumerableA.Count()+enumerableB.Count();
19 
20  public bool IsReadOnly => true;
21 
22  public void Add(T item) => throw new InvalidOperationException();
23 
24  public void Clear() => throw new InvalidOperationException();
25 
26  public bool Remove(T item) => throw new InvalidOperationException();
27 
28  public bool Contains(T item) => enumerableA.Contains(item) || enumerableB.Contains(item);
29 
30  public void CopyTo(T[] array, int arrayIndex)
31  {
32  void performCopy(IEnumerable<T> enumerable)
33  {
34  if (enumerable is ICollection<T> collection)
35  {
36  collection.CopyTo(array, arrayIndex);
37  arrayIndex += collection.Count;
38  }
39  else
40  {
41  foreach (var item in enumerable)
42  {
43  array[arrayIndex] = item;
44  arrayIndex++;
45  }
46  }
47  }
48 
49  performCopy(enumerableA);
50  performCopy(enumerableB);
51  }
52 
53  public IEnumerator<T> GetEnumerator()
54  {
55  foreach (T item in enumerableA) { yield return item; }
56  foreach (T item in enumerableB) { yield return item; }
57  }
58 
59  IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
60  }
61 
62  public class ListConcat<T> : CollectionConcat<T>, IList<T>, IReadOnlyList<T>
63  {
64  public ListConcat(IEnumerable<T> a, IEnumerable<T> b) : base(a, b) { }
65 
66  public int IndexOf(T item)
67  {
68  int aCount = 0;
69  if (enumerableA is IList<T> listA)
70  {
71  int index = listA.IndexOf(item);
72  if (index >= 0) { return index; }
73  aCount = listA.Count;
74  }
75  else
76  {
77  foreach (var a in enumerableA)
78  {
79  if (object.Equals(item, a)) { return aCount; }
80  aCount++;
81  }
82  }
83 
84  if (enumerableB is IList<T> listB)
85  {
86  int index = listB.IndexOf(item);
87  if (index >= 0) { return index + aCount; }
88  }
89  else
90  {
91  foreach (var b in enumerableB)
92  {
93  if (object.Equals(item, b)) { return aCount; }
94  aCount++;
95  }
96  }
97 
98  return -1;
99  }
100 
101  public void Insert(int index, T item)
102  {
103  throw new InvalidOperationException();
104  }
105 
106  public void RemoveAt(int index)
107  {
108  throw new InvalidOperationException();
109  }
110 
111  public T this[int index]
112  {
113  get
114  {
115  int aCount = enumerableA.Count();
116  return index < aCount ? enumerableA.ElementAt(index) : enumerableB.ElementAt(index - aCount);
117  }
118  set
119  {
120  throw new InvalidOperationException();
121  }
122  }
123  }
124 }
IEnumerator< T > GetEnumerator()
CollectionConcat(IEnumerable< T > a, IEnumerable< T > b)
readonly IEnumerable< T > enumerableA
void CopyTo(T[] array, int arrayIndex)
readonly IEnumerable< T > enumerableB
ListConcat(IEnumerable< T > a, IEnumerable< T > b)
void Insert(int index, T item)
void RemoveAt(int index)