Skip to content

Commit 47fd51b

Browse files
committed
Add ToDictionary tuple overload #85
1 parent 0f0b900 commit 47fd51b

File tree

10 files changed

+66
-4
lines changed

10 files changed

+66
-4
lines changed

sandbox/ConsoleApp/Program.cs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,18 @@
3030
//var ok = string.Join(',', tako);
3131

3232

33-
Int128[] source = [1, 2, 3, 4, 5];
33+
var items = new int[] { 1, 2, 3, 4, 5 };
34+
var tuples = items.Select(x => (x, x)).ToArray();
3435

36+
// System.Linq
37+
var a = tuples.ToDictionary();
38+
39+
// ZLinq
40+
var b = tuples.AsValueEnumerable().ToDictionary(); // No Build error.
3541

36-
source.AsValueEnumerable().Where(x => x % 2 == 0).Select(x => x * x);
3742

38-
var a = source.AsValueEnumerable().Max();
3943
Console.WriteLine(a);
44+
Console.WriteLine(b);
4045

4146

4247
static IEnumerable<T> ForceNotCollection<T>(IEnumerable<T> source)

src/FileGen/DropIn/Array.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,8 @@ public static TSource SumUnchecked<TSource>(this TSource[] source)
332332
public static (TSource[] Array, int Size) ToArrayPool<TSource>(this TSource[] source) => (source ?? throw new ArgumentNullException("source")).AsValueEnumerable().ToArrayPool();
333333
public static Dictionary<TKey, TValue> ToDictionary<TKey, TValue>(this KeyValuePair<TKey, TValue>[] source) where TKey : notnull => (source ?? throw new ArgumentNullException("source")).AsValueEnumerable().ToDictionary();
334334
public static Dictionary<TKey, TValue> ToDictionary<TKey, TValue>(this KeyValuePair<TKey, TValue>[] source, IEqualityComparer<TKey>? comparer) where TKey : notnull => (source ?? throw new ArgumentNullException("source")).AsValueEnumerable().ToDictionary(comparer);
335+
public static Dictionary<TKey, TValue> ToDictionary<TKey, TValue>(this (TKey Key, TValue Value)[] source) where TKey : notnull => (source ?? throw new ArgumentNullException("source")).AsValueEnumerable().ToDictionary();
336+
public static Dictionary<TKey, TValue> ToDictionary<TKey, TValue>(this (TKey Key, TValue Value)[] source, IEqualityComparer<TKey>? comparer) where TKey : notnull => (source ?? throw new ArgumentNullException("source")).AsValueEnumerable().ToDictionary(comparer);
335337
public static Dictionary<TKey, TSource> ToDictionary<TSource, TKey>(this TSource[] source, Func<TSource, TKey> keySelector) where TKey : notnull => (source ?? throw new ArgumentNullException("source")).AsValueEnumerable().ToDictionary(keySelector);
336338
public static Dictionary<TKey, TSource> ToDictionary<TSource, TKey>(this TSource[] source, Func<TSource, TKey> keySelector, IEqualityComparer<TKey>? comparer) where TKey : notnull => (source ?? throw new ArgumentNullException("source")).AsValueEnumerable().ToDictionary(keySelector, comparer);
337339
public static Dictionary<TKey, TElement> ToDictionary<TSource, TKey, TElement>(this TSource[] source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector) where TKey : notnull => (source ?? throw new ArgumentNullException("source")).AsValueEnumerable().ToDictionary(keySelector, elementSelector);

src/FileGen/DropIn/IEnumerable.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,8 @@ public static TSource SumUnchecked<TSource>(this IEnumerable<TSource> source)
332332
public static (TSource[] Array, int Size) ToArrayPool<TSource>(this IEnumerable<TSource> source) => (source ?? throw new ArgumentNullException("source")).AsValueEnumerable().ToArrayPool();
333333
public static Dictionary<TKey, TValue> ToDictionary<TKey, TValue>(this IEnumerable<KeyValuePair<TKey, TValue>> source) where TKey : notnull => (source ?? throw new ArgumentNullException("source")).AsValueEnumerable().ToDictionary();
334334
public static Dictionary<TKey, TValue> ToDictionary<TKey, TValue>(this IEnumerable<KeyValuePair<TKey, TValue>> source, IEqualityComparer<TKey>? comparer) where TKey : notnull => (source ?? throw new ArgumentNullException("source")).AsValueEnumerable().ToDictionary(comparer);
335+
public static Dictionary<TKey, TValue> ToDictionary<TKey, TValue>(this IEnumerable<(TKey Key, TValue Value)> source) where TKey : notnull => (source ?? throw new ArgumentNullException("source")).AsValueEnumerable().ToDictionary();
336+
public static Dictionary<TKey, TValue> ToDictionary<TKey, TValue>(this IEnumerable<(TKey Key, TValue Value)> source, IEqualityComparer<TKey>? comparer) where TKey : notnull => (source ?? throw new ArgumentNullException("source")).AsValueEnumerable().ToDictionary(comparer);
335337
public static Dictionary<TKey, TSource> ToDictionary<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector) where TKey : notnull => (source ?? throw new ArgumentNullException("source")).AsValueEnumerable().ToDictionary(keySelector);
336338
public static Dictionary<TKey, TSource> ToDictionary<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, IEqualityComparer<TKey>? comparer) where TKey : notnull => (source ?? throw new ArgumentNullException("source")).AsValueEnumerable().ToDictionary(keySelector, comparer);
337339
public static Dictionary<TKey, TElement> ToDictionary<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector) where TKey : notnull => (source ?? throw new ArgumentNullException("source")).AsValueEnumerable().ToDictionary(keySelector, elementSelector);

src/FileGen/DropIn/List.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,8 @@ public static TSource SumUnchecked<TSource>(this List<TSource> source)
332332
public static (TSource[] Array, int Size) ToArrayPool<TSource>(this List<TSource> source) => (source ?? throw new ArgumentNullException("source")).AsValueEnumerable().ToArrayPool();
333333
public static Dictionary<TKey, TValue> ToDictionary<TKey, TValue>(this List<KeyValuePair<TKey, TValue>> source) where TKey : notnull => (source ?? throw new ArgumentNullException("source")).AsValueEnumerable().ToDictionary();
334334
public static Dictionary<TKey, TValue> ToDictionary<TKey, TValue>(this List<KeyValuePair<TKey, TValue>> source, IEqualityComparer<TKey>? comparer) where TKey : notnull => (source ?? throw new ArgumentNullException("source")).AsValueEnumerable().ToDictionary(comparer);
335+
public static Dictionary<TKey, TValue> ToDictionary<TKey, TValue>(this List<(TKey Key, TValue Value)> source) where TKey : notnull => (source ?? throw new ArgumentNullException("source")).AsValueEnumerable().ToDictionary();
336+
public static Dictionary<TKey, TValue> ToDictionary<TKey, TValue>(this List<(TKey Key, TValue Value)> source, IEqualityComparer<TKey>? comparer) where TKey : notnull => (source ?? throw new ArgumentNullException("source")).AsValueEnumerable().ToDictionary(comparer);
335337
public static Dictionary<TKey, TSource> ToDictionary<TSource, TKey>(this List<TSource> source, Func<TSource, TKey> keySelector) where TKey : notnull => (source ?? throw new ArgumentNullException("source")).AsValueEnumerable().ToDictionary(keySelector);
336338
public static Dictionary<TKey, TSource> ToDictionary<TSource, TKey>(this List<TSource> source, Func<TSource, TKey> keySelector, IEqualityComparer<TKey>? comparer) where TKey : notnull => (source ?? throw new ArgumentNullException("source")).AsValueEnumerable().ToDictionary(keySelector, comparer);
337339
public static Dictionary<TKey, TElement> ToDictionary<TSource, TKey, TElement>(this List<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector) where TKey : notnull => (source ?? throw new ArgumentNullException("source")).AsValueEnumerable().ToDictionary(keySelector, elementSelector);

src/FileGen/DropIn/Memory.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,8 @@ public static TSource SumUnchecked<TSource>(this Memory<TSource> source)
332332
public static (TSource[] Array, int Size) ToArrayPool<TSource>(this Memory<TSource> source) => source.AsValueEnumerable().ToArrayPool();
333333
public static Dictionary<TKey, TValue> ToDictionary<TKey, TValue>(this Memory<KeyValuePair<TKey, TValue>> source) where TKey : notnull => source.AsValueEnumerable().ToDictionary();
334334
public static Dictionary<TKey, TValue> ToDictionary<TKey, TValue>(this Memory<KeyValuePair<TKey, TValue>> source, IEqualityComparer<TKey>? comparer) where TKey : notnull => source.AsValueEnumerable().ToDictionary(comparer);
335+
public static Dictionary<TKey, TValue> ToDictionary<TKey, TValue>(this Memory<(TKey Key, TValue Value)> source) where TKey : notnull => source.AsValueEnumerable().ToDictionary();
336+
public static Dictionary<TKey, TValue> ToDictionary<TKey, TValue>(this Memory<(TKey Key, TValue Value)> source, IEqualityComparer<TKey>? comparer) where TKey : notnull => source.AsValueEnumerable().ToDictionary(comparer);
335337
public static Dictionary<TKey, TSource> ToDictionary<TSource, TKey>(this Memory<TSource> source, Func<TSource, TKey> keySelector) where TKey : notnull => source.AsValueEnumerable().ToDictionary(keySelector);
336338
public static Dictionary<TKey, TSource> ToDictionary<TSource, TKey>(this Memory<TSource> source, Func<TSource, TKey> keySelector, IEqualityComparer<TKey>? comparer) where TKey : notnull => source.AsValueEnumerable().ToDictionary(keySelector, comparer);
337339
public static Dictionary<TKey, TElement> ToDictionary<TSource, TKey, TElement>(this Memory<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector) where TKey : notnull => source.AsValueEnumerable().ToDictionary(keySelector, elementSelector);

src/FileGen/DropIn/ReadOnlyMemory.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,8 @@ public static TSource SumUnchecked<TSource>(this ReadOnlyMemory<TSource> source)
332332
public static (TSource[] Array, int Size) ToArrayPool<TSource>(this ReadOnlyMemory<TSource> source) => source.AsValueEnumerable().ToArrayPool();
333333
public static Dictionary<TKey, TValue> ToDictionary<TKey, TValue>(this ReadOnlyMemory<KeyValuePair<TKey, TValue>> source) where TKey : notnull => source.AsValueEnumerable().ToDictionary();
334334
public static Dictionary<TKey, TValue> ToDictionary<TKey, TValue>(this ReadOnlyMemory<KeyValuePair<TKey, TValue>> source, IEqualityComparer<TKey>? comparer) where TKey : notnull => source.AsValueEnumerable().ToDictionary(comparer);
335+
public static Dictionary<TKey, TValue> ToDictionary<TKey, TValue>(this ReadOnlyMemory<(TKey Key, TValue Value)> source) where TKey : notnull => source.AsValueEnumerable().ToDictionary();
336+
public static Dictionary<TKey, TValue> ToDictionary<TKey, TValue>(this ReadOnlyMemory<(TKey Key, TValue Value)> source, IEqualityComparer<TKey>? comparer) where TKey : notnull => source.AsValueEnumerable().ToDictionary(comparer);
335337
public static Dictionary<TKey, TSource> ToDictionary<TSource, TKey>(this ReadOnlyMemory<TSource> source, Func<TSource, TKey> keySelector) where TKey : notnull => source.AsValueEnumerable().ToDictionary(keySelector);
336338
public static Dictionary<TKey, TSource> ToDictionary<TSource, TKey>(this ReadOnlyMemory<TSource> source, Func<TSource, TKey> keySelector, IEqualityComparer<TKey>? comparer) where TKey : notnull => source.AsValueEnumerable().ToDictionary(keySelector, comparer);
337339
public static Dictionary<TKey, TElement> ToDictionary<TSource, TKey, TElement>(this ReadOnlyMemory<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector) where TKey : notnull => source.AsValueEnumerable().ToDictionary(keySelector, elementSelector);

src/FileGen/DropIn/ReadOnlySpan.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,8 @@ public static TSource SumUnchecked<TSource>(this ReadOnlySpan<TSource> source)
333333
public static (TSource[] Array, int Size) ToArrayPool<TSource>(this ReadOnlySpan<TSource> source) => source.AsValueEnumerable().ToArrayPool();
334334
public static Dictionary<TKey, TValue> ToDictionary<TKey, TValue>(this ReadOnlySpan<KeyValuePair<TKey, TValue>> source) where TKey : notnull => source.AsValueEnumerable().ToDictionary();
335335
public static Dictionary<TKey, TValue> ToDictionary<TKey, TValue>(this ReadOnlySpan<KeyValuePair<TKey, TValue>> source, IEqualityComparer<TKey>? comparer) where TKey : notnull => source.AsValueEnumerable().ToDictionary(comparer);
336+
public static Dictionary<TKey, TValue> ToDictionary<TKey, TValue>(this ReadOnlySpan<(TKey Key, TValue Value)> source) where TKey : notnull => source.AsValueEnumerable().ToDictionary();
337+
public static Dictionary<TKey, TValue> ToDictionary<TKey, TValue>(this ReadOnlySpan<(TKey Key, TValue Value)> source, IEqualityComparer<TKey>? comparer) where TKey : notnull => source.AsValueEnumerable().ToDictionary(comparer);
336338
public static Dictionary<TKey, TSource> ToDictionary<TSource, TKey>(this ReadOnlySpan<TSource> source, Func<TSource, TKey> keySelector) where TKey : notnull => source.AsValueEnumerable().ToDictionary(keySelector);
337339
public static Dictionary<TKey, TSource> ToDictionary<TSource, TKey>(this ReadOnlySpan<TSource> source, Func<TSource, TKey> keySelector, IEqualityComparer<TKey>? comparer) where TKey : notnull => source.AsValueEnumerable().ToDictionary(keySelector, comparer);
338340
public static Dictionary<TKey, TElement> ToDictionary<TSource, TKey, TElement>(this ReadOnlySpan<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector) where TKey : notnull => source.AsValueEnumerable().ToDictionary(keySelector, elementSelector);

src/FileGen/DropIn/Span.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,8 @@ public static TSource SumUnchecked<TSource>(this Span<TSource> source)
333333
public static (TSource[] Array, int Size) ToArrayPool<TSource>(this Span<TSource> source) => source.AsValueEnumerable().ToArrayPool();
334334
public static Dictionary<TKey, TValue> ToDictionary<TKey, TValue>(this Span<KeyValuePair<TKey, TValue>> source) where TKey : notnull => source.AsValueEnumerable().ToDictionary();
335335
public static Dictionary<TKey, TValue> ToDictionary<TKey, TValue>(this Span<KeyValuePair<TKey, TValue>> source, IEqualityComparer<TKey>? comparer) where TKey : notnull => source.AsValueEnumerable().ToDictionary(comparer);
336+
public static Dictionary<TKey, TValue> ToDictionary<TKey, TValue>(this Span<(TKey Key, TValue Value)> source) where TKey : notnull => source.AsValueEnumerable().ToDictionary();
337+
public static Dictionary<TKey, TValue> ToDictionary<TKey, TValue>(this Span<(TKey Key, TValue Value)> source, IEqualityComparer<TKey>? comparer) where TKey : notnull => source.AsValueEnumerable().ToDictionary(comparer);
336338
public static Dictionary<TKey, TSource> ToDictionary<TSource, TKey>(this Span<TSource> source, Func<TSource, TKey> keySelector) where TKey : notnull => source.AsValueEnumerable().ToDictionary(keySelector);
337339
public static Dictionary<TKey, TSource> ToDictionary<TSource, TKey>(this Span<TSource> source, Func<TSource, TKey> keySelector, IEqualityComparer<TKey>? comparer) where TKey : notnull => source.AsValueEnumerable().ToDictionary(keySelector, comparer);
338340
public static Dictionary<TKey, TElement> ToDictionary<TSource, TKey, TElement>(this Span<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector) where TKey : notnull => source.AsValueEnumerable().ToDictionary(keySelector, elementSelector);

src/FileGen/DropinGen.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,10 @@ string BuildSourceType(MethodInfo methodInfo, string replacement, bool isArray)
342342
{
343343
sourceGenericTypeName = "KeyValuePair<TKey, TValue>";
344344
}
345+
else if (methodInfo.Name is "ToDictionary" && methodInfo.ToString()!.Contains("ValueTuple"))
346+
{
347+
sourceGenericTypeName = "(TKey Key, TValue Value)";
348+
}
345349

346350
if (isArray)
347351
{

src/ZLinq/Linq/ToDictionary.cs

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,46 @@ public static Dictionary<TKey, TValue> ToDictionary<TEnumerator, TKey, TValue>(t
4242
}
4343
}
4444

45+
public static Dictionary<TKey, TValue> ToDictionary<TEnumerator, TKey, TValue>(this ValueEnumerable<TEnumerator, (TKey Key, TValue Value)> source)
46+
where TKey : notnull
47+
where TEnumerator : struct, IValueEnumerator<(TKey Key, TValue Value)>
48+
#if NET9_0_OR_GREATER
49+
, allows ref struct
50+
#endif
51+
{
52+
return ToDictionary(source, null);
53+
}
54+
55+
public static Dictionary<TKey, TValue> ToDictionary<TEnumerator, TKey, TValue>(this ValueEnumerable<TEnumerator, (TKey Key, TValue Value)> source, IEqualityComparer<TKey>? comparer)
56+
where TKey : notnull
57+
where TEnumerator : struct, IValueEnumerator<(TKey Key, TValue Value)>
58+
#if NET9_0_OR_GREATER
59+
, allows ref struct
60+
#endif
61+
{
62+
using var enumerator = source.Enumerator;
63+
if (enumerator.TryGetSpan(out var span))
64+
{
65+
var dict = new Dictionary<TKey, TValue>(span.Length, comparer);
66+
foreach (var item in span)
67+
{
68+
dict.Add(item.Key, item.Value);
69+
}
70+
return dict;
71+
}
72+
else
73+
{
74+
var dict = enumerator.TryGetNonEnumeratedCount(out var count)
75+
? new Dictionary<TKey, TValue>(count, comparer)
76+
: new Dictionary<TKey, TValue>(comparer);
77+
while (enumerator.TryGetNext(out var item))
78+
{
79+
dict.Add(item.Key, item.Value);
80+
}
81+
return dict;
82+
}
83+
}
84+
4585
public static Dictionary<TKey, TSource> ToDictionary<TEnumerator, TSource, TKey>(this ValueEnumerable<TEnumerator, TSource> source, Func<TSource, TKey> keySelector)
4686
where TKey : notnull
4787
where TEnumerator : struct, IValueEnumerator<TSource>
@@ -126,6 +166,5 @@ public static Dictionary<TKey, TElement> ToDictionary<TEnumerator, TSource, TKey
126166
return dict;
127167
}
128168
}
129-
130169
}
131170
}

0 commit comments

Comments
 (0)