Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 合并两个列表的副本时的条件合并_C#_List - Fatal编程技术网

C# 合并两个列表的副本时的条件合并

C# 合并两个列表的副本时的条件合并,c#,list,C#,List,我有两张名单 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", is

我有两张名单

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"}
};
private List L1=新列表
{
新的DealResponse{detailId=“5”,detailcd=“ABC”,fileName=“string 1”,isNgo=“0”},
新的DealResponse{detailId=“5”,detailcd=“DEF”,fileName=“string 2”,isNgo=“0”},
新的DealResponse{detailId=“5”,detailcd=“XYZ”,fileName=“string”,isNgo=“0”}
};
私有列表L2=新列表
{
新的DealResponse{detailId=“5”,detailcd=“ABC”,fileName=“string 11”,isNgo=“1”},
新的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"},
};
var结果=新列表
{
新的DealResponse{detailId=“5”,detailcd=“ABC”,fileName=“string 11”,isNgo=“1”},
新的DealResponse{detailId=“5”,detailcd=“DEF”,fileName=“string 2”,isNgo=“0”},
新的DealResponse{detailId=“5”,detailcd=“XYZ”,fileName=“string”,isNgo=“0”},
新的DealResponse{detailId=“6”,detailcd=“MNO”,fileName=“string 3”,isNgo=“1”},
};
注意,在结果中,我们从L2中选择了这个条目,因为detailId=5,detailcd=ABC是重复的

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());
    }
}
public List GetDealResponse(字符串detailId)
{
//我的主要困惑是在做工会工作时如何处理这个案子
//我提到过(第二个列表中的重复选择条目)
var L3=L1.Union(L2,newdealresponsecomparer()).ToList();
}  
公共类DealResponse
{
公共字符串detailId{get;set;}
公共字符串detailcd{get;set;}
公共字符串文件名{get;set;}
公共字符串isNgo{get;set;}
}
公共类DealResponseComparer:IEqualityComparer
{
公共布尔等于(DealResponse x,DealResponse y)
{
返回x.detailId==y.detailId&&x.detailcd==y.detailcd;
}
public int GetHashCode(DealResponse obj)
{
返回(obj.detailId.GetHashCode()+obj.detailcd.GetHashCode());
}
}
我正在尝试编写一个方法,该方法接受detailId并通过合并以上两个列表返回结果,如果存在重复项(重复定义=当detailId时,两个列表之间的detailcd匹配),则从L2中选择条目

另一种说法是:

  • 从L2开始
  • 添加L1中尚未包含在L2中的所有内容
  • 这可以通过一条线完成:

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

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

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

    尝试
    var L3=L2.Union(L1,newdealresponsecomparer()).ToList()
    @Matt.G在这种情况下,如何确保在存在重复项时我从L2中选择了一个条目。如果在存在重复项时查看结果,则应包括L2中的条目,我不理解您的
    GetDealResponse(int-detailId)
    detailId
    如何在这里发挥作用?结果列表不应包含
    detailId=6
    的元素,而应包含
    detailId=5
    的不同元素(例如),并具有L2优先级。如果您的方法将
    int
    作为
    detailId
    的值,则会造成混乱,但是它在
    DealResponse
    类中声明为
    字符串。@RufusL很抱歉,这是我的错误,更正了它。感谢you@Ami代码修改。测试它,看看它是否返回您期望的结果。(顺便说一句,您在这里输入了一个错误:
    dealresponsecomparer:IEqualityComparer
    )。您的解决方案解决了我的问题。谢谢。此外,我试图提高投票率并接受它,但看起来我至少需要15个声誉才能做到这一点。
    { 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" }