هل تريد التعبير عن وسيطات النوع العام لـ C# بشكل أكثر إيجازًا؟
-
11-12-2019 - |
سؤال
مستوحاة من
المقارنة بين مجموعتين من أجل المساواة بغض النظر عن ترتيب العناصر فيهما
لقد قمت بإنشاء طريقة تمديد لاختبار ما إذا كانت مجموعتان متكافئتان.لاستخدام طريقة الامتداد، لا بد لي من تحديد معلمتين من النوع مثل هذا:
IsEquivalentToTestHelper<ObservableCollection<string>, string>(first, second, true);
هل هناك طريقة لتنفيذ طريقة التمديد بحيث يكون هناك قيد عام واحد فقط (على سبيل المثال: ObservableCollection<string>
) هل تحتاج إلى تحديد؟
تحديث:نشر الكود المعدل بناءً على الإجابات باعتباره استجابة إضافية على السؤال الذي ألهم هذا واحد.
هذا هو الكود الأصلي الخاص بي:
static public class EnumerableExtensions
{
static public bool IsEquivalentTo<E,T>(this E first, E second) where E : IEnumerable<T>
{
if ((first == null) != (second == null))
return false;
if (!object.ReferenceEquals(first, second) && (first != null))
{
if (first.Count() != second.Count())
return false;
if ((first.Count() != 0) && HaveMismatchedElement<E,T>(first, second))
return false;
}
return true;
}
private static bool HaveMismatchedElement<E,T>(E first, E second) where E : IEnumerable<T>
{
int firstCount;
int secondCount;
var firstElementCounts = GetElementCounts<E,T>(first, out firstCount);
var secondElementCounts = GetElementCounts<E,T>(second, out secondCount);
if (firstCount != secondCount)
return true;
foreach (var kvp in firstElementCounts)
{
firstCount = kvp.Value;
secondElementCounts.TryGetValue(kvp.Key, out secondCount);
if (firstCount != secondCount)
return true;
}
return false;
}
private static Dictionary<T, int> GetElementCounts<E,T>(E enumerable, out int nullCount) where E : IEnumerable<T>
{
var dictionary = new Dictionary<T, int>();
nullCount = 0;
foreach (T element in enumerable)
{
if (element == null)
{
nullCount++;
}
else
{
int num;
dictionary.TryGetValue(element, out num);
num++;
dictionary[element] = num;
}
}
return dictionary;
}
static private int GetHashCode<E,T>(IEnumerable<T> enumerable) where E : IEnumerable<T>
{
int hash = 17;
foreach (T val in enumerable.OrderBy(x => x))
hash = hash * 23 + val.GetHashCode();
return hash;
}
}
المحلول
giveacodicetagpre.
نصائح أخرى
يمكنك إسقاط أول واحد والحفاظ على الثانية: giveacodicetagpre.
تحتاج فقط إلى استبدال كل E
مع IEnumerable<T>
, ، وقم بإسقاط عبارات أين
على سبيل المثال:
static public bool IsEquivalentTo<T>(this IEnumerable<T> first, IEnumerable<T> second)
var firstElementCounts = GetElementCounts<IEnumerable<T>,T>(first, out firstCount);
static private int GetHashCode<T>(IEnumerable<T> enumerable)
لا تنتمي إلى StackOverflow