C#オブジェクトコンパレータを使ったオブジェクト比較

C#オブジェクトコンパレータを使ったオブジェクト比較

Objects Comparerはオブジェクト比較ツールであり、C#の一般的なデータ構造はこの3つのライブラリを使用して比較することができ、より複雑なオブジェクトも比較することができます。

最后更新 2022/07/15 21:55
黑哥聊dotNet
预计阅读 3 分钟
分类
.NET
标签
.NET C#

プレゼンテーション:プレゼンテーション

Objects Comparer是用于对象比较的工具,C#常见的数据结构都是可以用这个三方库进行对比,比较复杂的对象也是可以比较的。

简而言之,Objects Comparer 是一个对象到对象的比较器,它允许逐个成员递归得比较对象,并为某些属性、字段或类型定义自定义比较规则。

インストールする。

nuget 搜索ObjectsComparer

使用する。

まず、単純なクラスを定義します:

public class UserInfomation
{
    public string Name { get; set; }
    public int Age { get; set; }
    public string Sex { get; set; }
}

实例化两个UserInfomation对象并赋不同的值,再实例化 ObjectsComparer.Comparer比较器:

var comparer1 = new ObjectsComparer.Comparer<UserInfomation>();

然后我们将实例化的两个对象传入到 ObjectsComparer.Comparer 方法中:

IEnumerable<Difference> differences1;
var isEqual1 = comparer1.Compare(userInfomationOld, userInfomationNew, out differences1);

そして、戻り値でオブジェクトが一致するかどうかを判断し、不一致の場合はdifference1で不一致の値を取得することができます。

出力を見ると、インスタンス化された2つのオブジェクトがageプロパティの値が異なることがわかります。

那我们再试试List<T>类型的:

List<UserInfomation> lstUserInfomationsOld=new List<UserInfomation>();
for (int i = 0; i < 3; i++)
{
    UserInfomation user=new UserInfomation();
    user.Name = "张三";
    user.Age = 30;
    user.Sex = "男";
    lstUserInfomationsOld.Add(user);
}
List<UserInfomation> lstUserInfomationsNew = new List<UserInfomation>();
for (int i = 0; i < 2; i++)
{
    UserInfomation user = new UserInfomation();
    user.Name = "李四";
    user.Age = 30;
    user.Sex = "男";
    lstUserInfomationsNew.Add(user);
}


var comparer = new ObjectsComparer.Comparer<List<UserInfomation>>();
IEnumerable<Difference> differences;
var isEqual = comparer.Compare(lstUserInfomationsNew, lstUserInfomationsOld, out differences);
string differencesMsg = string.Join(Environment.NewLine, differences);
Console.WriteLine(differencesMsg);

出力を確認すると、数量の不一致が問題であることがわかります。

アプリケーションシナリオ

NETクライアント開発者のような人なら誰でも知っているように、基本的なデータを維持するときにデータ編集を避けられません。

編集ページを開き、実際にデータを変更せず、保存ボタンまたはフィールドをクリックしてデータを変更したかどうかを比較するか、直接ブルートフォース処理を行い、データを変更したかどうかを確認せずに、updateインターフェイスを直接呼び出します。

Objects Comparerが役に立ちます。まずBaseFormをカプセル化し、次にベースクラスコントロール内の比較メソッドをカプセル化します。

protected Result ComPare<T>(T t, T s)
{
    Result result =new Result();
    var comparer = new ObjectsComparer.Comparer<T>();
    IEnumerable<Difference> differences;
    bool isEqual = comparer.Compare(t, s, out differences);
    result.IsEqual = isEqual;
    if (!isEqual)
    {
        string differencesMsg = string.Join(Environment.NewLine, differences);
        result.Msg=differencesMsg;
    }
    return result;
}

public class Result
{
    public bool IsEqual { get; set; }
    public string Msg { get; set; }
}

2つのオブジェクト間で値が変更されているかどうかを取得し、変更されていない場合は、“データは変更されていません。フォームを閉じますか?”などのプロンプトを表示します。

public partial class MainFrm : BaseForm
{
    Test _testOld;
    public MainFrm()
    {
        InitializeComponent();
        _testOld = LoadData();
        txtName.Text= _testOld.Name;
        txtAge.Text = _testOld.Age.ToString();
        txtSex.Text = _testOld.Sex;
    }
    private Test LoadData()
    {
        Test test = new Test();
        test.Name = "张三";
        test.Age = 30;
        test.Sex = "男";
        return test;


    }


    private void uiButton1_Click(object sender, EventArgs e)
    {
        Test test=new Test();
        test.Name =txtName.Text;
        test.Age =int.Parse( txtAge.Text);
        test.Sex=txtSex.Text;
            Result result=  ComPare(_testOld, test);
        if (result.IsEqual)
        {
            MessageBox.Show("数据未修改");
            return;
        }
        //然后再写保存逻辑
        MessageBox.Show("保存成功");
    }
}
public class Test
{
    public string Name { get; set; }
    public int Age { get; set; }
    public string Sex { get; set; }
}

他にもたくさんのシナリオがありますが、私がよく使っているシナリオを共有します。

最後に、ネット環境を改善するためのより便利なツールを共有してください!

Keep Exploring

延伸阅读

更多文章
同分类 / 同标签 2026/04/22

バージョン別の. NETサポート状況(250 7 0 7更新)

仮想マシンとテストマシンを使用して、各バージョンのオペレーティングシステムの. NETサポートをテストします。オペレーティングシステムのインストール後、対応するランタイムを測定し、スターダストエージェントをパスとして実行できます。

继续阅读
同分类 / 同标签 2026/02/07

AOTの使用経験

プロジェクトの最初から、新しい機能が追加されたり、新しい構文が使用されたりするたびに、AOTリリーステストを行うという良い習慣を身につける必要があります。

继续阅读