1

私は2つのリストで作業しています.メインに同じタイプが含まれているかどうかを確認したい. 2 つのリストに同じ数または順序が含まれている必要はありません。一致するすべてのタイプが含まれているだけです。私はこれがLinqで非常に可能であることを知っていますが、私はそれを使用できません.

    private static bool ContentsMatch(List<Type> list1, List<Type> list2)
    {
        if (list1.Count != list2.Count)
            return false;

        for (int i = 0; i < list1.Count; i++)
        {
            if (!list1[i].Equals(list2[i]))
                return false;
        }
        return true;
    }

私が試した上記の方法は、それらが同じ順序である場合にのみtrueを返します。

4

4 に答える 4

3

コメントで提供されたアルゴリズムのコード。

注文やカウント、重複アイテムに依存しません。また、一般的で抽象化されています。

bool IsSameSet<T>(IEnumerable<T> l1, IEnumerable<T> l2)
{
  return IsSubSet(l1, l2) && IsSubSet(l2, l1); 
}

bool IsSubSet<T>(IEnumerable<T> l1, IEnumerable<T> l2)
{
  var lookup = new Dictionary<T, bool>();

  foreach (var e in l1)
    lookup[e] = true;

  foreach (var e in l2)
    if (!lookup.ContainsKey(e))
      return false;

  return true;
}

使用法:

Type[] l1 = { typeof(object), typeof(int), typeof(long), typeof(object) };
Type[] l2 = { typeof(int), typeof(long), typeof(object) };

var result = IsSameSet(l1, l2);
Console.WriteLine(result);  // prints true

ユーザーの演習:

追加のパラメータを追加IEqualityComparer<T>して、ディクショナリに渡される を提供します。

于 2013-02-17T07:57:00.720 に答える
0

ユーザー定義のカスタマイズされた型を比較す​​るには、Equals と GetHashCode をオーバーライドする必要があります。以下は、参照できるコード スニペットです。

    public class CustomizedDataType
    {
        private int field1;
        private string field2;

        public CustomizedDataType(int field1,string field2)
        {
            this.field1 = field1;
            this.field2 = field2;
        }

        public override bool Equals(object obj)
        {
            CustomizedDataType dataType = obj as CustomizedDataType;
            if (this.field1 == dataType.field1 && this.field2 == dataType.field2)
            {
                return true;
            }
            return false;
        }

        public override int GetHashCode()
        {
            return (this.field1.GetHashCode() + this.field2.GetHashCode());
        }

実行するサンプルコード:

    static void Main(string[] args)
    {
        //Test Data
        List<CustomizedDataType> dataTypeContaineer1 = new List<CustomizedDataType>();
        dataTypeContaineer1.Add(new CustomizedDataType(10,"Test10"));
        dataTypeContaineer1.Add(new CustomizedDataType(11, "Test11"));
        dataTypeContaineer1.Add(new CustomizedDataType(12, "Test12"));

        //Test Data
        List<CustomizedDataType> dataTypeContaineer2 = new List<CustomizedDataType>();
        dataTypeContaineer2.Add(new CustomizedDataType(100, "Test10"));
        dataTypeContaineer2.Add(new CustomizedDataType(11, "Test11"));
        dataTypeContaineer2.Add(new CustomizedDataType(12, "Test120"));

        //Checking if both the list contains the same types.
        if (dataTypeContaineer1.GetType() == dataTypeContaineer2.GetType())
        {
            //Checking if both the list contains the same count
            if (dataTypeContaineer1.Count == dataTypeContaineer2.Count)
            {
                //Checking if both the list contains the same data.
                for (int index = 0; index < dataTypeContaineer1.Count; index++)
                {
                    if(!dataTypeContaineer1[index].Equals(dataTypeContaineer2[index]))
                    {
                        Console.WriteLine("Mismatch @ Index {0}", index);
                    }
                }
            }
        }
    }

出力:

ここに画像の説明を入力

于 2013-02-17T03:58:09.073 に答える
-1

List<T>2つの両方が一致するを持っていることを意味すると仮定するとT、次を使用できます。

private static Boolean MatchingBaseType(IEnumerable a, IEnumerable b)
{
    return GetIListBaseType(a) == GetIListBaseType(b);
}

private static Type GetIListBaseType(IEnumerable a)
{
    foreach (Type interfaceType in a.GetType().GetInterfaces())
    {
        if (interfaceType.IsGenericType &&
            (interfaceType.GetGenericTypeDefinition() == typeof(IList<>) ||
             interfaceType.GetGenericTypeDefinition() == typeof(IEnumerable<>) ||
             interfaceType.GetGenericTypeDefinition() == typeof(ICollection<>))
        )
        {
            return interfaceType.GetGenericArguments()[0];
        }
    }
    return default(Type);
}

あなたはカウントは問題ではないと言います (あなたはチェックしていますが.Count()--なぜ?) しかし、これは 2 つのリストに同じ型が含まれている場合に返されるはずです。

于 2013-02-17T03:02:04.603 に答える
-1

C# のキーワード 'is' を使用して、オブジェクトが特定の型と互換性があるかどうかを確認できます。 http://msdn.microsoft.com/en-us/library/vstudio/scekt9xw.aspx

于 2013-02-17T02:34:53.607 に答える