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中选择条目
另一种说法是:
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" }