如何使用Linq组合两个c#对象

时间:2015-12-07 22:00:23

标签: c# linq

我正在尝试将两个LIKE对象组合在一起并删除重复项。

Tried this

This didn't work

这是我的对象[简单]

public class LabelItem
{
    public string LabelName { get; set; }
    public string LabelValue { get; set; }
}

我的数据调用返回相同的对象类型

public static List<LabelItem> ReturnControlLabelList(Enums.LanguageType languageType, string labelList = "")

我把它传递给方法

string[] LABELLIST = new string[] { "foxLabel", "commonLabel" };
var helper = new LabelHelper(, LABELLIST);

这是我得到空的地方

    public LabelHelper(Enums.LanguageType languageType, string[] labelListName)
    {
        if (labelListName != null)
        {
            List<LabelItem> labels = new List<LabelItem>();
            this.LabelList = new List<LabelItem>();

            foreach (var name in labelListName)
            {
                labels = DBCommon.ReturnControlLabelList(languageType, name);
                this.LabelList.Concat(labels).Distinct().ToList();
            }

        }
        else
        {
            this.LabelList = null;
        }

    }

public List<LabelItem> LabelList { get; private set; }

concat无效。我一直在为标签计数0,我可以看到返回在for循环中返回275和125.

提前感谢您的帮助。

还有问题

我想使用下面的建议但仍在努力。

传入的字符串[]将获得两个标签项列表,这些标签项在循环中连接在一起时不是唯一的。我需要this.LabelList中返回的多个列表的不同。

我得到了它,但是...我确定这是非常低效的。

感谢您的帮助。

             this.LabelList = new List<LabelItem>();

            foreach (var name in labelListName)
            {
                var ret =  DBCommon.ReturnControlLabelList(languageType, name);
                this.LabelList = this.LabelList.Concat(ret).Distinct().ToList();             
            }

            var distinctList = this.LabelList.GroupBy(x => new  { x.LabelName, x.LabelValue })
                 .Select(x => x.FirstOrDefault());

            this.LabelList = new List<LabelItem>();

            foreach (var item in distinctList)
            {
                this.LabelList.Add(item);
                Debug.WriteLine(item.LabelName + ' '  + item.LabelValue);
            }

        }

2 个答案:

答案 0 :(得分:8)

this.LabelList.Concat(labels).Distinct().ToList();没有将它分配给某些东西没有多大意义。 LINQ查询不会修改源集合,它会返回一个新的集合,因此如果您希望它更新,则必须将其分配回this.LabelList

this.LabelList = this.LabelList.Concat(labels).Distinct().ToList();

你应该知道,这是非常低效的解决方案,你应该选择基于SelectMany的东西:

this.LabelList
    = labelListName.SelectMany(name => DBCommon.ReturnControlLabelList(languageType, name)
                   .Distinct()
                   .ToList();

答案 1 :(得分:1)

Concat和大多数其他linq方法返回一个IEnumerable,然后你需要做一些事情。它不会更改现有列表,因此您只需将其分配给:

this.LabelList = this.LabelList.Concat(labels).Distinct().ToList();