在C#中比较两个List<enum>对象

6

我有两个词典,如下所示:

Dictionary<string, object> dict1 = new Dictionary<string, object>();
Dictionary<string, object> dict2 = new Dictionary<string, object>();

我想比较它们,其中有一些条目是List<Enum>,我该如何比较这些List<Enum>对象。请参见以下示例代码:

enum Days { Monday, Tuesday, Wednesday }
enum Colors { Red, Green, Blue }
enum Cars { Acura, BMW, Ford }

填充字典:

List<Days> lst1 = new List<Days>();
List<Days> lst2 = new List<Days>();

lst1.Add(Days.Monday); lst1.Add(Days.Tuesday); 
lst2.Add(Days.Monday); lst2.Add(Days.Tuesday);

dict1.Add("DayEnum", lst1);
dict2.Add("DayEnum", lst2);

foreach (KeyValuePair<string, object> entry in dict1)
{
    var t1 = dict1[entry.Key];
    var t2 = dict2[entry.Key];

    if (dict1[entry.Key].GetType().IsGenericType && Compare(dict1[entry.Key], dict2[entry.Key]))
    {
                // List elements matches...
    } 
    else if (dict1[entry.Key].Equals(dict2[entry.Key]))
    {
                // Other elements matches...
    }
}

如果我不提供准确的Enum,例如 IEnumerable<Days> ,它就无法匹配,但我需要一种通用的代码来适用于任何Enum。

到目前为止,我找到了以下比较方式,但我需要一个通用的比较语句,因为我不知道所有的Enums:

private static bool Compare<T>(T t1, T t2)
{
    if (t1 is IEnumerable<T>)
    {
        return (t1 as IEnumerable<T>).SequenceEqual(t2 as IEnumerable<T>);
    }
    else
    {
        Type[] genericTypes = t1.GetType().GetGenericArguments();
        if (genericTypes.Length > 0 && genericTypes[0].IsEnum)
        {
            if (genericTypes[0] == typeof(Days))
            {
                return (t1 as IEnumerable<Days>).SequenceEqual(t2 as IEnumerable<Days>);
            }
            else if (genericTypes[0] == typeof(Colors))
            {
                return (t1 as IEnumerable<Colors>).SequenceEqual(t2 as IEnumerable<Colors>);
            }
        }

        return false;
    }
}

为什么需要测试它是否是枚举列表?枚举是值类型,因此您可以只测试值类型。 - David Arno
@David,这不是枚举比较,而是枚举列表比较,无法像值类型一样进行比较。 - Asim
那肯定是一个列表比较的问题了吧? - David Arno
可能是重复的问题:如何在C#中获取两个列表的差异? - David Arno
1个回答

3

首先使用 Type.GetGenericArguments() 获取泛型参数的类型,然后您可以在其上调用 IsEnum

因此,类似于以下内容:

var listType = dict1[entry.Key].GetType();
if (listType.IsGenericType)
{
   var typeArguments = listType.GetGenericArguments();
   //if you only have List<T> in there, you can pull the first one
   var genericType = typeArguments[0];
   if (genericType.IsEnum) {
        // List elements matches...
   }                
} 

回答您的评论,如果您想比较这两个列表,您可以按如下方式操作。由于您在字典中将列表作为对象,因此最好创建自己的方法来检查每个元素是否与另一个列表中的元素相同,因为对于SequenceEqual,您需要知道类型。

        var listType = dict1[entry.Key].GetType();
        var secondListType = dict2[entry.Key].GetType();
        if (listType.IsGenericType && secondListType.IsGenericType)
        {
            //if you only have List<T> in there, you can pull the first one
            var genericType = listType.GetGenericArguments()[0];
            var secondGenericType = secondListType.GetGenericArguments()[0];
            if (genericType.IsEnum && genericType == secondGenericType && AreEqual((Ilist)dict1[entry.Key],(Ilist)dict2[entry.Key]))
            {                    
                // List elements matches...
            }
        }

    public bool AreEqual(IList first, IList second)
    {
        if (first.Count != second.Count)
        {
            return false;
        }

        for (var elementCounter = 0; elementCounter < first.Count; elementCounter++)
        {
            if (!first[elementCounter].Equals(second[elementCounter]))
            {
                return false;
            }
        }
        return true;
    } 

我已经尝试过了,但是没有找到匹配这些List对象的方法。如果您知道,请编写通用比较语句。 - Asim
@Asim,我更新了我的答案,包括比较这两个列表的代码。 - Stephen
Stephen:你运行了你的代码吗?它不会起作用,因为我已经尝试过了。 - Asim
@Asim:我改了我的答案,我没有考虑到你正在使用“object”作为类型。对此我很抱歉。 - Stephen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接