1

LINQ結果内の要素を比較する方法を見つけようとしています

これはLINQコードです

var sets =
         from a in patient.AsParallel()
         from b in patient.AsParallel()
         from c in patient.AsParallel()
         from d in patient.AsParallel()



where a.VisitNum < b.VisitNum && b.VisitNum < c.VisitNum && c.VisitNum < d.VisitNum
select new { a, b, c, d };

var sets1 =
                 from a in patient1.AsParallel()
                 from b in patient1.AsParallel()
                 from c in patient1.AsParallel()
                 from d in patient1.AsParallel()
select new { a, b, c, d };

このコードを使用して比較しましたが、毎回falseになります

 if (Enumerable.SequenceEqual(sets, sets1) == true)

なにか提案を ?

// ジャニの回答として更新

public class Result
    {
        public ACVsize5 a { get; set; }
        public ACVsize5 b { get; set; }
        public ACVsize5 c { get; set; }
        public ACVsize5 d { get; set; }


}

public override Boolean Equals(Result other)
        {
            return other.a.date.ToString() == a.date.ToString() && other.a.RaId.ToString() == a.RaId.ToString() && other.b.date.ToString() == b.date.ToString() && other.b.RaId.ToString() == b.RaId.ToString() && other.c.date.ToString() == c.date.ToString() && other.c.RaId.ToString() == c.RaId.ToString() && other.d.date.ToString() == d.date.ToString() && other.d.RaId.ToString() == d.RaId.ToString();
        }

var sets =
             from a in patient
             from b in patient
             from c in patient
             from d in patient
where a.VisitNum < b.VisitNum && b.VisitNum < c.VisitNum && c.VisitNum < d.VisitNum              

select new Result { a = a, b = b, c = c, d = d };
var sets1 =
             from t in patient1
             from y in patient1
             from u in patient1
             from p in patient1
where t.VisitNum < y.VisitNum && y.VisitNum < u.VisitNum && u.VisitNum < p.VisitNum 
             select new Result { a = t, b = y, c = u, d = p };

しかし、オーバーライドメソッドでエラーが発生しました

//Error 1 no suitable method found to override
4

2 に答える 2

1

実際には、内部で生成された 2 つの異なる匿名クラス (System.Linq.ParallelQuery<AnonymousType#1>'および'System.Linq.IQueryable<AnonymousType#2>') を比較しようとしています。

私は間違っていました.@Allonが述べたように、同じ構造に対してクラスが1つだけ生成されます。

左括弧の前にクラス名を指定せずに Linq クエリで select new を使用すると、内部で匿名クラスが生成され、ILDasmReflectorなどのツールで表示できます。

もう 1 つの重要な点は、宣言した型 (.NET Framework ライブラリの一部ではない) のオブジェクトを比較する場合、それらは内容ではなく参照によって比較されるということです。したがって、Equals メソッドをオーバーライドして、等価性の独自の実装を定義する必要があります。

コンパイラがそれらのメソッドを生成するため、匿名クラスの場合はそうではありません。

詳細: 1 , 2

単純なクラス (たとえば、result という名前) を作成し、そのタイプのクエリの結果を作成します。次に、クラスoverrideのメソッドを使用します。すべてが正しくなります。EqualsSequenceEqual

public Class Result{
  public string a {get;set}
  public string b {get;set}
  public string c {get;set}
  public string d {get;set}
  //this is a short incomplete version of equals implementation
  //consult other questions to learn more about equality
  public override boolean Equals(Result other)
  { return other.a == a && other.b == b && other.c == c && other.d == d}
}

//you must add another order by clause to query so that both of them have the same order
var sets =
     (from a in patient.AsParallel()
     from b in patient.AsParallel()
     from c in patient.AsParallel()
     from d in patient.AsParallel()
     where a.VisitNum < b.VisitNum && b.VisitNum < c.VisitNum && c.VisitNum < d.VisitNum
     select new Result{ a = a, b = b, c = c, d = d }).AsEnumerable();
var sets1 =
     (from a in patient1.AsParallel()
     from b in patient1.AsParallel()
     from c in patient1.AsParallel()
     from d in patient1.AsParallel()
     select new Result{ a = a, b = b, c = c, d = d }).AsEnumerable();
//Now it would be right
if (Enumerable.SequenceEqual(sets, sets1))
{
   //do your stuff
}

これらのシーケンスが同じ順序であることを確認するだけです。

于 2012-12-02T14:41:30.727 に答える
0

多くのソリューションを試した後、セット内の要素を比較するために2つの foreach を互いに作成しましたが、このソリューションは非常に悪く、巨大なデータを比較するには時間がかかります

于 2012-12-03T19:17:30.503 に答える