我有两个词典,如:
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...
}
}
除非我提供确切的枚举,即IEnumerable<Days>
,否则它不匹配,但我需要一个通用代码才能适用于任何枚举。
到目前为止,我发现了以下比较方式,但我需要一个通用的比较语句,因为我不知道所有的枚举:
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;
}
}
答案 0 :(得分: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...
}
}
在回答您的评论时,如果您想比较2个列表,您可以执行以下操作。因为您将列表作为字典中的对象,所以您最好创建自己的方法来检查每个元素是否与另一个列表中的元素相同,因为对于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;
}