1

現在、私が取り組んでいる比較プロジェクトがあり、比較する必要がある 2 つのクラスの情報が記載されたリストを受け取っています。私は C# でこのプロジェクトに取り組んでおり、MVC Web ページに表示されています。私は C# が初めてで、Web 開発はまったく初めてです。

要素を比較するために1つずつ書き出すことができることを知っています

元:

List<ESHClass> eshlist; //This just to show that eshlist is of type ESHClass and i'm 
                               purposefully comparing two elements from the same list

     bool pNum = eshlist[0].PolicyNumber == eshlist[1].PolicyNumber;

しかし、C# でそれを行うためのより効率的な方法があるかどうか疑問に思っていましたか? 異なるフィールドのみを表示するため、1 つずつ比較する必要があります。オンラインで少しブラウジングしましたが、探しているものがまったく見つかりませんでした。より良い方向に私を送るための良いヒントや記事があれば、私はそれを感謝します!


説明:

ツールで達成したいことを明確にするために書いています。

クラスタイプのリストがあります(例:ESHCLASS)

List<ESHClass> eshlist;

ESHClass は次のような要素で構成されています。

public class ESHClass{
  public string PolicyNumber;
  public string PolicyMod;
  public string MultiPolicy;
  public string HasSwimmingPool;
};

つまり、eshlist にはポリシー (ESHClass) が必要で、値が等しいとします。

eshlist[0].PolicyNumber= "7";
eshlist[0].PolicyMod= "00";
eshlist[0].MultiPolicy= "Yes";
eshlist[0].HasSwimmingPool= "No";

eshlist[1].PolicyNumber= "7";
eshlist[1].PolicyMod= "00";
eshlist[1].MultiPolicy= "No";
eshlist[0].HasSwimmingPool= "Yes";

だから私がやろうとしているのは、各要素を抽象的な方法で比較し、異なるものだけを保存し、現在MVC ListViewとして設定されている私のサイトに表示することです(表示は私が問題を抱えていた部分ではありません)。

したがって、私の例では、Web サイトには次のように表示されます。

マルチポリシーはい マルチポリシーいいえ

HasSwimmingPoolいいえ HasSwimmingPoolはい

4

4 に答える 4

0

物事を1つずつ書き出すことを伴わないアプローチには、おそらくリフレクションが含まれるでしょう。これはいくつかの点で優れていますが、通常は最初のオプションではありません。

あなたが得たものは、私の意見ではおそらく最善の汎用アプローチです。魔法の文字列がなく、パフォーマンスが非常に高速で、読みやすいです。唯一の大きな欠点は、プロパティを含めるのを見落としたり、さまざまなプロパティを比較したり、結果のbool.

どのプロパティが異なるかという知識をどうするかにもよりますが、ここで比較しているクラスに次のようなものを含めるとよいでしょう。

public class MyClass {
    public IEnumerable<string> GetDifferingPropertyNames(MyClass other) { ... }
}

これは、取得したものと同様の1つずつアプローチで実装できます(ただし、プロパティを定義したクラスに含まれている方が良いです。たとえば、プロパティを追加する場合、そのメソッドを変更することを覚えておくだけでよいためです) 、別のファイルの何かではありません)、またはリフレクションを使用します。ただし、オブジェクト全体が等しいかどうかだけを気にするのではなく、どのプロパティが等しくないかをリストアップしてください。

于 2013-07-17T17:37:29.127 に答える
0

2 つのオブジェクト間で異なるすべてのプロパティを取得するには、リフレクションを使用できます。リフレクションは、2 つの型のすべてのプロパティを取得し、その型の 2 つのインスタンスのそのプロパティの値を取得して、それらを比較して、どのプロパティが異なる値を持つかを示すことができます。

このメソッドはジェネリックを使用して、指定された 2 つのインスタンスが同じ型であることを確認します。そうでない場合、比較は意味がありません。

public static IEnumerable<PropertyInfo> GetDifferentProperties<T>(T first, T second)
{
    return typeof(T).GetProperties().Where(prop =>
        !object.Equals(prop.GetValue(first), prop.GetValue(second)));
}

このメソッド呼び出しの結果からName、プロパティを文字列として取得できます。これを使用して、それらのインスタンスや他のインスタンスのプロパティの値を取得したり、さらに多くのことを行うことができます。

于 2013-07-17T17:40:06.083 に答える