5

それぞれ独自のモデルを持つ2つのテーブルがあります...

    class FamilyMan
    { 
        public int family_ID {get; set;}

        public string name {get; set;}
        public string fav_color {get; set;}
    }

    class BusinessMan
    {
        public int work_ID {get; set;}

        public string name {get; set;}
        public string fav_color {get; set;}

        //unrelated data etc
        public string job_title {get; set;}
    }

name...そして、すべての FamilyMans をとに基づいて一致する BusinessMans に一致させたいと考えていますfav_color

私は現在、次のようなものを持っています:

    //fill lists from database
    var family_list = dbContext.FamilyMen.ToList();
    var busy_list = dbContext.BusinessMen.ToList();
    //create empty dict for matching the two types
    var matches = new Dict<FamilyMan, BusinessMan>();


    foreach (FamilyMan fam_man in family_list) {
        foreach (BusinessMan busy_man in busy_list) {
            //if both names and colors match, consider them a matching
            //object and add them each to the dict
            if (fam_man.name == busy_man.name &&
                    fam_man.color == busy_man.color) {
                matches_MtO[fam_man] = busy_man;
            }
        }
    }

しかし、完了するまでにかなりの時間がかかります。

また、 a を使用して 1 つのリストをループし、foreachLINQ の FirstOrDefault を使用してそれらを照合することも検討しましたが、効率はほぼ同じようです。

FamilyMans とs を一緒に一致させるより良い方法はありBusinessManますか?

4

3 に答える 3

4

このような linq クエリはより高速でしょうか:

var matches = (
    from f in family_list
    join b in busy_list
    on f.color == b.color
    && f.name == b.name
    select new {f, b}
);
于 2013-01-11T17:39:22.157 に答える
3

LINQ の結合構文を使用する必要があります。これにより、バックエンド データベースで照合が可能になり、結果のみが返されます。

複合キーで結合を有効にするには、こちらの MSDN ガイダンスに従ってください。

var query = from fm in dbContext.FamilyMen
            join bm in dbContext.BusinessMen on 
                new { bm.name, bm.color } equals new { fm.name, fm.color }
            select new {
               FamilyMan = fm,
               BusinessMan = bm
            };

var resultList = query.ToList();
于 2013-01-11T17:41:55.330 に答える
2

O(N-squared) である両方のリストをループしています。

アイテムが一致すると、再度一致する必要はありません。一致したアイテムをリストから削除して、不要な比較を減らすことができます。

さらに良いことに、同一の 2 つのプロパティを照合しているので、結合されたプロパティを表すハッシュをキーとして使用して辞書を作成できます。次に、family_list_dictionary のキーをループして、busy_list_dictionary で一致するキーを探すだけです。

于 2013-01-11T17:28:35.553 に答える