-1

編集:

私がやろうとしているのは、等しいかどうかを見つけることですdb.Id.... etc .....すべての小道具xml.Iddb.SubTitlexml.SubTitle

また、私は試しました

bool result = db.SequenceEqual(xml)常に false を返します。

編集終了

助けを求める前に検索しましたが、自分の問題に取り組む最善の方法がわかりません。

2 つの IList オブジェクトがあり、どちらもまったく同じプロパティを持っていますが、データが異なる可能性があります。1 つのオブジェクトは db から入力され、もう 1 つは xml から読み取られて、両方のソースが同期されていることを比較します。

ここに私のオブジェクトは次のようになります:

public class EmployeeObject
{
    public Int32 Id { get; set; }
    public string SubTitle { get; set; }
    public string Desc { get; set; }
    public bool Active { get; set; }
    public string ActiveDateTime { get; set; }
}

これが私が試したことです:

    IList<EmployeeObject> db = Db.EmployeeRepository.PopulateFromDb();
    IList<EmployeeObject> xml = Xml.EmployeeRepository.PopulateFromXml();

//これまでのところ両方のオブジェクトにデータが取り込まれています....

今すぐ比較する時間:

私はこのようなことを試しました:

   if ((object)xml == null || ((object)db) == null)
       return Object.Equals(xml, db);

   return xml.Equals(db); // returning false all the time

両方のオブジェクトがまったく同じデータを持っていることを確認しましたが、それでも返されますfalse

4

6 に答える 6

2

クラスで次のようにオーバーライドする必要がEqualsあります。GetHashCode

public class EmployeeObject {
  public Int32 Id { get; set; }
  public string SubTitle { get; set; }
  public string Desc { get; set; }
  public bool Active { get; set; }
  public string ActiveDateTime { get; set; }
  public override bool Equals(object o){
     EmployeeObject e = o as EmployeeObject;
     if(e == null) return false;
     return Id == e.Id && SubTitle == e.SubTitle && Desc == e.Desc 
            && Active == e.Active && ActiveDateTime == e.ActiveDateTime; 
  }
  public override int GetHashCode(){
     return Id.GetHashCode() ^ SubTitle.GetHashCode() ^ Desc.GetHashCode()
            ^ Active.GetHashCode() ^ ActiveDateTime.GetHashCode();             
  }
}

次に、SequenceEqualメソッドを使用します。

return db.OrderBy(e=>e.Id).SequenceEqual(xml.OrderBy(e=>e.Id));
于 2013-10-23T22:30:21.413 に答える
1

IEqualityComparer を実装し、IEqualityComparerを取る SequenceEquals のオーバーロードを使用できます。msdn の IEqualityComparer のサンプル コードを次に示します。

class BoxEqualityComparer : IEqualityComparer<Box>
{
    public bool Equals(Box b1, Box b2)
    {
        if (b1.Height == b2.Height && b1.Length == b2.Length && b1.Width == b2.Width)
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    public int GetHashCode(Box bx)
    {
        int hCode = bx.Height ^ bx.Length ^ bx.Width;
        return hCode.GetHashCode();
    }
}

その後、次のように SequenceEquals を使用できます。

if (db.SequnceEquals(xml), new MyEqualityComparer())
    { /* Logic here */ }

これは、アイテムがリスト内で同じ順序で並べられている場合にのみ true を返すことに注意してください。必要に応じて、次のようにアイテムを事前注文できます。

if (db.OrderBy(item => item.id).SequnceEquals(xml.OrderBy(item => item.id)), new MyEqualityComparer())
    { /* Logic here */ }
于 2013-10-23T22:34:17.910 に答える
0

SequenceEqualのインスタンスを実際に比較できる場合は、使用できますEmployeeObject。おそらくEqualsオンにする必要がありますEmployeeObject

public override bool Equals(object o)
{
  EmployeeObject obj = o as EmployeeObject;
  if(obj == null) return false;

  // Return true if all the properties match
  return (Id == obj.Id &&
          SubTitle == obj.SubTitle &&
          Desc == obj.Desc &&
          Active == obj.Active &&
          ActiveDateTime == obj.ActiveDateTime);
}

次に、次のことができます。

var same = db.SequenceEqual(xml);

各インスタンスを比較する方法IEqualityComparerを指示するを実装するクラスを渡すこともできます。SequenceEqual

var same = db.SequenceEqual(xml, someComparer);

もう1つの簡単な方法は、それほど速くはありませんが、比較したい値の2つの列挙、おそらくidあなたの場合はプロパティを構築することです:

var ids1 = db.Select(i => i.Id); // List of all Ids in db
var ids2 = xml.Select(i => i.Id); // List of all Ids in xml
var same = ids1.SequenceEqual(ids2); // Both lists are the same
于 2013-10-23T22:35:44.493 に答える