Add IList<T>.Swap (#62)

This commit is contained in:
Oliver Booth 2022-07-14 10:22:37 +01:00
parent 3a5b017a72
commit 02765b8b19
No known key found for this signature in database
GPG Key ID: 32A00B35503AF634
3 changed files with 106 additions and 0 deletions

View File

@ -9,6 +9,7 @@
- X10D: Added `DateTime.GetIso8601WeekOfYear()` and `DateTimeOffset.GetIso8601WeekOfYear()` - X10D: Added `DateTime.GetIso8601WeekOfYear()` and `DateTimeOffset.GetIso8601WeekOfYear()`
- X10D: Added `DirectoryInfo.Clear([bool])` - X10D: Added `DirectoryInfo.Clear([bool])`
- X10D: Added `IList<T>.RemoveRange(Range)` - X10D: Added `IList<T>.RemoveRange(Range)`
- X10D: Added `IList<T>.Swap(IList<T>)` (#62)
- X10D: Added `Point.IsOnLine(LineF)`, `Point.IsOnLine(PointF, PointF)`, and `Point.IsOnLine(Vector2, Vector2)` - X10D: Added `Point.IsOnLine(LineF)`, `Point.IsOnLine(PointF, PointF)`, and `Point.IsOnLine(Vector2, Vector2)`
- X10D: Added `PointF.IsOnLine(LineF)`, `PointF.IsOnLine(PointF, PointF)`, and `PointF.IsOnLine(Vector2, Vector2)` - X10D: Added `PointF.IsOnLine(LineF)`, `PointF.IsOnLine(PointF, PointF)`, and `PointF.IsOnLine(Vector2, Vector2)`
- X10D: Added `Point.ToSize()` - X10D: Added `Point.ToSize()`

View File

@ -154,4 +154,57 @@ public class ListTests
{ {
Assert.ThrowsException<ArgumentNullException>(() => ((List<int>?)null)!.Shuffle()); Assert.ThrowsException<ArgumentNullException>(() => ((List<int>?)null)!.Shuffle());
} }
[TestMethod]
public void Swap_ShouldThrowArgumentNullException_GivenNullSource()
{
Assert.ThrowsException<ArgumentNullException>(() => ((IList<int>?)null)!.Swap(new List<int>()));
}
[TestMethod]
public void Swap_ShouldThrowArgumentNullException_GivenNullTarget()
{
Assert.ThrowsException<ArgumentNullException>(() => new List<int>().Swap(null!));
}
[TestMethod]
public void Swap_ShouldSwapElements_GivenMatchingElementCount()
{
var first = new List<int> {1, 2, 3};
var second = new List<int> {4, 5, 6};
first.Swap(second);
CollectionAssert.AreEqual(new[] {4, 5, 6}, first, string.Join(' ', first));
CollectionAssert.AreEqual(new[] {1, 2, 3}, second, string.Join(' ', second));
first.Swap(second);
CollectionAssert.AreEqual(new[] {1, 2, 3}, first, string.Join(' ', first));
CollectionAssert.AreEqual(new[] {4, 5, 6}, second, string.Join(' ', second));
}
[TestMethod]
public void Swap_ShouldSwapElements_GivenDifferentElementCount()
{
var first = new List<int>
{
1,
2,
3,
4,
5
};
var second = new List<int> {6, 7};
first.Swap(second);
CollectionAssert.AreEqual(new[] {6, 7}, first, string.Join(' ', first));
CollectionAssert.AreEqual(new[] {1, 2, 3, 4, 5}, second, string.Join(' ', second));
first.Swap(second);
CollectionAssert.AreEqual(new[] {1, 2, 3, 4, 5}, first, string.Join(' ', first));
CollectionAssert.AreEqual(new[] {6, 7}, second, string.Join(' ', second));
}
} }

View File

@ -191,4 +191,56 @@ public static class ListExtensions
(source[count], source[index]) = (source[index], source[count]); (source[count], source[index]) = (source[index], source[count]);
} }
} }
/// <summary>
/// Swaps all elements in a list with the elements in another list.
/// </summary>
/// <param name="source">The first list.</param>
/// <param name="other">The second list.</param>
/// <typeparam name="T">The type of the elements in <paramref name="source" /> and <paramref name="other" />.</typeparam>
/// <exception cref="ArgumentNullException">
/// <para><paramref name="source" /> is <see langword="null" />.</para>
/// -or-
/// <para><paramref name="other" /> is <see langword="null" />.</para>
/// </exception>
public static void Swap<T>(this IList<T> source, IList<T> other)
{
#if NET6_0_OR_GREATER
ArgumentNullException.ThrowIfNull(source);
ArgumentNullException.ThrowIfNull(other);
#else
if (source is null)
{
throw new ArgumentNullException(nameof(source));
}
if (other is null)
{
throw new ArgumentNullException(nameof(other));
}
#endif
int min = System.Math.Min(source.Count, other.Count);
for (var index = 0; index < min; index++)
{
(source[index], other[index]) = (other[index], source[index]);
}
if (other.Count < source.Count)
{
for (int index = min; index < source.Count;)
{
other.Add(source[index]);
source.RemoveAt(index);
}
}
else if (source.Count < other.Count)
{
for (int index = min; index < other.Count;)
{
source.Add(other[index]);
other.RemoveAt(index);
}
}
}
} }