5

我有两张桌子,每张都有自己的型号...

    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;}
    }

...并且我希望能够将所有 FamilyMans 与基于name和的匹配 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 循环一个列表,foreach然后使用 LINQs FirstOrDefault 来匹配它们,但效率似乎差不多。

有没有更好的方法来匹配FamilyMans 和BusinessMans ?

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)。

一旦一个项目被匹配,它就不必再次匹配。您可以从列表中删除匹配的项目,减少不必要的比较。

更好的是,由于您要匹配两个相同的属性,因此您可以使用表示组合属性的哈希作为键来构建字典。然后您可以遍历family_list_dictionary 的键并在busy_list_dictionary 中查找匹配的键。

于 2013-01-11T17:28:35.553 回答