如何使用LINQ返回Distinct Row

时间:2015-07-21 16:01:56

标签: c# asp.net-mvc linq

我有两行,除了一列外,所有数据都相同。 我想在UI上只显示一行,但是一行具有不同数据的行应显示为逗号分隔值。

样本数据

PricingID  Name Age Group
1           abc 56  P1
1           abc 56  P2 

Output should be :
PricingID  Name Age Group
1           abc 56  P1,P2

我正在使用这种方法,但它不起作用,它只给我两行,但数据我能用逗号连接。

  List<PricingDetailExtended> pricingDetailExtendeds = _storedProcedures.GetPricingAssignment(pricingScenarioName, regionCode, productCode, stateCode, UserId, PricingId).ToList();
            var pricngtemp = pricingDetailExtendeds.Select(e => new
            {
                PricingID = e.PricingID,
                OpportunityID = e.OpportunityID,
                ProductName = e.ProductName,
                ProductCD = e.ProductCD
            });

            pricingDetailExtendeds.ForEach(e=>
                {
                    e.ProductCD =  string.Join(",",string.Join(",", (pricngtemp.ToList().Where(p => p.PricingID == e.PricingID).Select(k => k.ProductCD).ToArray())).Split(',').Distinct().ToArray());
                    e.OpportunityID =string.Join(",", string.Join(",", (pricngtemp.ToList().Where(p => p.PricingID == e.PricingID).Select(k => k.OpportunityID).ToArray())).Split(',').Distinct().ToArray());
                    e.ProductName =string.Join(",", string.Join(",", (pricngtemp.ToList().Where(p => p.PricingID == e.PricingID).Select(k => k.ProductName).ToArray())).Split(',').Distinct().ToArray());            


                }
                );

          //  pricingDetailExtendeds = GetUniquePricingList(pricingDetailExtendeds);

            return pricingDetailExtendeds.Distinct().AsEnumerable();

任何机构都可以建议我更好的方法以及如何解决这个问题?

感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

您想使用as.data.frame(do.call(rbind, mapply(function(id, vals) cbind(ID = id, Value = vals), names(d), d, SIMPLIFY = FALSE))) linq函数。

然后我使用GroupBy函数使组以逗号分隔。

这样的事情:

String.Join

您可以轻松地将其推断到其他字段。

要返回var pricingDetailExtendeds = new[] { new { PricingID = 1, Name = "abc", Age = 56, Group = "P1" }, new { PricingID = 1, Name = "abc", Age = 56, Group = "P2" } }; var pricngtemp = pricingDetailExtendeds.GroupBy(pde => new {pde.PricingID, pde.Name, pde.Age}) .Select(g => new {g.Key, TheGroups = String.Join(",", g.Select(s => s.Group))}).ToList(); ,只需在选择中创建它即可。像这样的东西

PricingDetailExtended

你不会有.Select(g => new PricingDetailExtended { PricingID = g.Key.PricingId, TheGroups = String.Join(",", g.Select(s => s.Group)) }).ToList(); 字段,所以只需用正确的字段替换该字段。

答案 1 :(得分:1)

我在评论中描述的一个例子将是以下内容。我希望将其转移到辅助函数中。

List<PriceDetail> list = new List<PriceDetail>
{
    new PriceDetail {Id = 1, Age = 56, Name = "abc", group = "P1"},
    new PriceDetail {Id = 1, Age = 56, Name = "abc", group = "P2"},
    new PriceDetail {Id = 2, Age = 56, Name = "abc", group = "P1"}
};

Dictionary<PriceDetailKey, StringBuilder> group = new Dictionary<PriceDetailKey, StringBuilder>();

for (int i = 0; i < list.Count; ++i)
{
    var key = new PriceDetailKey { Id = list[i].Id, Age = list[i].Age, Name = list[i].Name };               
    if (group.ContainsKey(key))
    {
        group[key].Append(",");
        group[key].Append(list[i].group);
    }
    else
    {
        group[key] = new StringBuilder();
        group[key].Append(list[i].group);
    }
}

List<PriceDetail> retList = new List<PriceDetail>();
foreach (KeyValuePair<PriceDetailKey, StringBuilder> kvp in group)
{
    retList.Add(new PriceDetail{Age = kvp.Key.Age, Id = kvp.Key.Id, Name = kvp.Key.Name, group = kvp.Value.ToString()});
}

您甚至可以将最终循环转换为LINQ表达式,如:

group.Select(kvp => new PriceDetail {Age = kvp.Key.Age, Id = kvp.Key.Id, Name = kvp.Key.Name, group = kvp.Value.ToString()});

值得注意的是,如果你编写了一个自定义相等比较器并使用了一个列表而不是字典,那么在没有构造新对象的开销的情况下你可以做类似的事情。这样做的好处是,当你完成时,它将是你的返回值,而不必再进行一次迭代。

有几种不同的方法可以获得结果。你甚至可以在SQL中进行分组。

相关问题