Skip to content

Commit

Permalink
Add ToImmDict(Func<T, K> selectKey, Func<T, V> selectVal).
Browse files Browse the repository at this point in the history
And `ToImmDict(Func<T, K> selectKey)` to simplify some conversion code
instead of having to call `ToDictionary(selKey, selVal).ToImmDict()`.
This avoids one dictionary copy as well.
  • Loading branch information
oconnor0 committed Jan 31, 2025
1 parent 88fe70e commit f2e0554
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 0 deletions.
28 changes: 28 additions & 0 deletions Xledger.Collections.Test/TestImmDict.cs
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,34 @@ public void TestNoOps() {
Assert.ThrowsAny<NotSupportedException>(() => idict.Remove(4));
Assert.ThrowsAny<NotSupportedException>(() => ((System.Collections.ICollection)idict).CopyTo((Array)null, 0));
}

[Fact]
public void TestSelectKey() {
var dct = Enumerable.Range(-100, 1_000).ToDictionary(i => i);
var imm = Enumerable.Range(-100, 1_000).ToImmDict(i => i);

for (int i = -1000; i < 2000; ++i) {
Assert.Equal(dct.ContainsKey(i), imm.ContainsKey(i));
if (dct.TryGetValue(i, out var dctValue)) {
imm.TryGetValue(i, out var immValue);
Assert.Equal(dctValue, immValue);
}
}
}

[Fact]
public void TestSelectKeySelectValue() {
var dct = Enumerable.Range(-100, 1_000).ToDictionary(i => i, i => (i * i).ToString());
var imm = Enumerable.Range(-100, 1_000).ToImmDict(i => i, i => (i * i).ToString());

for (int i = -1000; i < 2000; ++i) {
Assert.Equal(dct.ContainsKey(i), imm.ContainsKey(i));
if (dct.TryGetValue(i, out var dctValue)) {
imm.TryGetValue(i, out var immValue);
Assert.Equal(dctValue, immValue);
}
}
}
}


17 changes: 17 additions & 0 deletions Xledger.Collections/Extensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,23 @@ public static ImmDict<K, V> ToImmDict<K, V>(this IEnumerable<(K, V)> xs) {
};
}

public static ImmDict<K, T> ToImmDict<T, K>(this IEnumerable<T> xs, Func<T, K> selectKey) {
return xs switch {
null => ImmDict<K, T>.Empty,
_ => new ImmDict<K, T>(xs.ToDictionary(selectKey)),
};
}

public static ImmDict<K, V> ToImmDict<T, K, V>(
this IEnumerable<T> xs,
Func<T, K> selectKey,
Func<T, V> selectVal
) {
return xs switch {
null => ImmDict<K, V>.Empty,
_ => new ImmDict<K, V>(xs.ToDictionary(selectKey, selectVal)),
};
}
internal static T[] ArrayOf<T>(T[] arr) {
return (T[])arr.Clone();
}
Expand Down

0 comments on commit f2e0554

Please sign in to comment.