List<string> ListA= .....
List<B> ListB=....
List<B> ListC=new List<B>();
public class B
{
public B(string Source,B MatchedItem=default)
{ Adr=Source;
if(MatchedItem!=default)
Key=MatchedItem.Key;
else
Key="";
}
string Adr;
string Key;
}
foreach(string itemA in ListA)
{
foreach(B itemB in ListB)
{
bool Found=false;
if(itemB.Adr==itemA || itemB.Adr.Contains(itemA)||itemA.Contains(itemA.Key))
{
ListC.add(new B(itemA,itemB));
Found=true;
}
if(!Found)
ListC.add(new B(itemA));
}
}
要将上面的嵌套循环代码转换为LINQ写法,我们可以使用SelectMany来创建ListC的集合。这里我们还需要处理一些逻辑,包括检查itemB.Adr是否包含itemA,或者itemA是否包含itemB.Key。下面是一个使用LINQ重写上述代码的例子:
csharpList<string> ListA = ...; // 你的ListA初始化代码
List<B> ListB = ...; // 你的ListB初始化代码
// LINQ查询来生成ListC
var ListC = ListA.SelectMany(itemA =>
{
// 检查ListB中是否有匹配的项
var matchedItemB = ListB.FirstOrDefault(itemB => itemB.Adr == itemA || itemB.Adr.Contains(itemA) || itemA.Contains(itemB.Key));
// 根据是否找到匹配的项来创建B的实例
return matchedItemB != null
? new[] { new B(itemA, matchedItemB) } // 如果找到匹配的项,创建一个新的B实例
: new[] { new B(itemA) }; // 如果没有找到匹配的项,创建一个没有MatchedItem的B实例
}).ToList();
这个LINQ查询首先使用SelectMany对ListA中的每个元素执行一个投影,该投影返回一个IEnumerable<B>。对于ListA中的每个元素itemA,它都会尝试在ListB中找到一个匹配的itemB,这个匹配是基于itemB.Adr与itemA的相等性、itemB.Adr包含itemA或itemA包含itemB.Key的逻辑。
如果找到了匹配的itemB,则创建一个新的B实例,其中Source是itemA,MatchedItem是itemB。如果没有找到匹配的itemB,则只创建一个B实例,其中Source是itemA,MatchedItem是默认值。
最后,将SelectMany的结果转换为List<B>,即ListC。
注意,这里的FirstOrDefault方法用于找到第一个匹配的项。如果没有找到匹配的项,它将返回B类型的默认值,这与你原始代码中的default(B)行为相同。由于你的B类没有定义默认构造函数,所以default(B)将不会编译通过。上面的代码假设ListB中至少有一个元素,或者你可以对FirstOrDefault的调用进行null检查来避免潜在的空引用异常。