【问题标题】:Condition merge while merging duplicate of two List合并两个列表的重复项时条件合并
【发布时间】:2018-10-08 19:28:56
【问题描述】:

我有两个列表,

private List<DealResponse> L1 = new List<DealResponse>
{
    new DealResponse {detailId = "5", detailcd = "ABC", fileName = "string 1", isNgo = "0"},
    new DealResponse {detailId = "5", detailcd = "DEF", fileName = "string 2", isNgo = "0"},
    new DealResponse {detailId = "5", detailcd = "XYZ", fileName = "string ", isNgo = "0"}
};

private List<DealResponse> L2 = new List<DealResponse>
{
    new DealResponse {detailId = "5", detailcd = "ABC", fileName = "string 11", isNgo = "1"},
    new DealResponse {detailId = "6", detailcd = "MNO", fileName = "string 3", isNgo = "1"}
};

我正在尝试编写一个接受detailId并通过合并以上两个列表返回结果的方法,如果有重复(重复定义=两个列表之间的detailId,detailcd匹配时)从L2中选择条目

所以合并后的结果就是

var Result = new List<DealResponse>
{
    new DealResponse {detailId = "5", detailcd = "ABC", fileName = "string 11", isNgo = "1"},
    new DealResponse {detailId = "5", detailcd = "DEF", fileName = "string 2", isNgo = "0"},
    new DealResponse {detailId = "5", detailcd = "XYZ", fileName = "string ", isNgo = "0"},
    new DealResponse {detailId = "6", detailcd = "MNO", fileName = "string 3", isNgo = "1"},
};

请注意,由于 detailId = 5,detailcd = ABC 是重复的,因此我们从 L2 中选择了这个条目

public List<DealResponse> GetDealResponse(string detailId)   
{
    // My main confusion is while doing union how to handle the case 
    // which I mentioned (On duplicate select entry from second list)  
    var L3 = L1.Union(L2, new DealResponseComprarer()).ToList();         
}  

public class DealResponse
{
    public string detailId { get; set; }
    public string detailcd { get; set; }
    public string fileName { get; set; }
    public string isNgo { get; set; }
}

public class DealResponseComprarer : IEqualityComparer<DealResponse>
{
    public bool Equals(DealResponse x, DealResponse y)
    {
        return x.detailId == y.detailId &&  x.detailcd == y.detailcd ;
    }

    public int GetHashCode(DealResponse obj)
    {
        return (obj.detailId.GetHashCode() + obj.detailcd.GetHashCode());
    }
}

【问题讨论】:

  • 试试var L3 = L2.Union(L1, new DealResponseComprarer()).ToList();
  • @Matt.G 在这种情况下,如何确保当有重复项时我从 L2 中选择一个条目。如果您在有重复结果时查看结果应该包括来自 L2 的条目
  • 我听不懂你的GetDealResponse(int detailId)detailId 如何在这里发挥作用?结果列表不应包含具有detailId = 6 的元素,而应仅包含具有detailId = 5Distinct 元素(例如),具有L2 优先级。
  • 当您的方法将int 用于detailId 时,这会让人感到困惑,但它在DealResponse 类中被声明为string
  • @RufusL 抱歉,这是我的错误,已更正。谢谢

标签: c# list linq merge


【解决方案1】:

我正在尝试编写一个接受detailId并通过合并以上两个列表返回结果的方法,如果有重复(重复定义=两个列表之间的detailId,detailcd匹配时)从L2中选择条目

另一种说法是:

  1. 从 L2 开始
  2. 添加 L1 中尚未在 L2 中的所有内容

这可以用一行来完成:

var combined = L2.Concat(L1.Except(L2, new DealResponseComprarer()));

Example on DotNetFiddle

【讨论】:

    【解决方案2】:

    如果您确实想使用detailId 过滤结果,由于此值已传递给GetDealResponse() 方法,您可以将.Where 条件添加到均衡的Union 列表中。

    public class DealResponse
    {
        public string detailId { get; set; }
        public string detailcd { get; set; }
        public string fileName { get; set; }
        public string isNgo { get; set; }
    }
    
    public List<DealResponse> GetDealResponse(string detailId)
    {
        return L2.Union(L1, new DealResponseComprarer())
                 .Where(elm => elm.detailId.Equals(detailId)).ToList();
    }
    
    
    L1 = new List<DealResponse>() {
    new DealResponse() { detailId = "5", detailcd = "ABC" , fileName = "string 1", isNgo = "0" },
    new DealResponse() { detailId = "5", detailcd = "DEF" , fileName = "string 2", isNgo = "0" },
    new DealResponse() { detailId = "5", detailcd = "XYZ" , fileName = "string ", isNgo = "0" }};
    
    L2 = new List<DealResponse>() {
    new DealResponse() { detailId = "5", detailcd = "ABC" , fileName = "string 11", isNgo = "1" },
    new DealResponse() { detailId = "6", detailcd = "MNO" , fileName = "string 3", isNgo = "1" }};
    
    string ID = "5";
    List<DealResponse> L3 = GetDealResponse(ID);
    

    这将返回此列表:

    { detailId = "5", detailcd = "ABC" , fileName = "string 11", isNgo = "1" }
    { detailId = "5", detailcd = "DEF" , fileName = "string 2", isNgo = "0" }
    { detailId = "5", detailcd = "XYZ" , fileName = "string ", isNgo = "0" }
    

    【讨论】:

    • @Ami 代码已修改。测试它以查看它是否返回您期望的结果。 (顺便说一句,你这里有一个错字:DealResponseComprarer : IEqualityComparer&lt;DealResponse&gt;)。
    • 您的解决方案解决了我的问题。谢谢。此外,我尝试投票并接受它,但看起来我需要至少 15 名声望才能做到这一点。
    猜你喜欢
    • 2015-11-29
    • 2017-06-05
    • 1970-01-01
    • 2015-09-20
    • 1970-01-01
    • 2013-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多