C# 转动foreach&x27的链条;用于将列表中的元素插入到linq中的另一个列表中
我已经研究了几个小时,我得到的唯一结论是我需要拿起一本关于Linq的好书 因此,这里的交易:我有三个对象列表,属于以下类(从现在起,我将它们称为“父列表”):C# 转动foreach&x27的链条;用于将列表中的元素插入到linq中的另一个列表中,c#,linq,list,foreach,C#,Linq,List,Foreach,我已经研究了几个小时,我得到的唯一结论是我需要拿起一本关于Linq的好书 因此,这里的交易:我有三个对象列表,属于以下类(从现在起,我将它们称为“父列表”): public class State { public int IdState {get; set;} public string NameState {get; set;} private IList<City> cityList = new List<C
public class State
{
public int IdState {get; set;}
public string NameState {get; set;}
private IList<City> cityList = new List<City>();
public void AddCity(City city)
{
cityList.Add(city);
}
}
public class City
{
public int IdCity { get; set; }
public string NameCity { get; set; }
public int IdState { get; set; }
private IList<Company> companyList = new List<Company>();
public void AddCompany(Company company)
{
companyList.Add(company);
}
}
public class Company
{
public int IdCompany { get; set; }
public string NameCompany { get; set; }
public int IdCity { get; set; }
}
丑陋,对吧?那么,我该如何使用linq实现同样的目标呢?我想可能是一个更有效的问题:在这种情况下,是否值得使用linq(它都指向“是”,但数字…)
顺便说一句:这种方法的工作原理与我预期的一样您在这里逻辑上所做的是一个连接操作。您当前的代码实际上是查找所有可能的城市和州对,然后只归档匹配的对。您可以在LINQ中表示这一点,但您不想这样做。有更有效的方法来执行只包含ge的连接生成所需的精确对。LINQ
Join
操作符利用了这一点
您的代码归结为两个不同的Join
调用,然后对每个结果进行迭代,根据查询执行对象的变异
var stateCityPairs = from state in finalList
join city in cityList
on state.IdState equals city.IdState
select new { state, city };
foreach (var pair in stateCityPairs)
pair.state.AddCity(pair.city);
var cityCompanyPairs = from city in cityList
join company in companyList
on city.IdCity equals company.IdCity
select new { city, company };
foreach (var pair in cityCompanyPairs)
pair.city.AddCompany(pair.company);
虽然这实际上是一个多一点的代码,但对于更大的集合来说,它的性能会更好一些,并且在语义上也代表了代码的意图。在逻辑上,您在这里所做的是一个连接操作。您当前的代码实际上是查找所有可能的城市和州对,然后只归档那些可能的城市和州对tch。您可以在LINQ中表示这一点,但您不想这样做。有更有效的方法执行连接,只生成您需要开始的精确对。LINQ
Join
操作符利用了这一点
您的代码归结为两个不同的Join
调用,然后对每个结果进行迭代,根据查询执行对象的变异
var stateCityPairs = from state in finalList
join city in cityList
on state.IdState equals city.IdState
select new { state, city };
foreach (var pair in stateCityPairs)
pair.state.AddCity(pair.city);
var cityCompanyPairs = from city in cityList
join company in companyList
on city.IdCity equals company.IdCity
select new { city, company };
foreach (var pair in cityCompanyPairs)
pair.city.AddCompany(pair.company);
虽然这实际上是一段稍多的代码,但对于较大的集合,这将执行得更好一些,并且在语义上也表示代码的意图。对于LINQ,您可能希望将私有IList转换为公共IList(或List或IEnumerable或IQueryable),以便直接设置它们 假设finalList已经预先填充了状态:
var finalList=finalList
.Select(fl=>new State
{
fl.IdState,
fl.NameState,
cityList=cityList.Where(cl=>cl.IdState==fl.IdState).Select(cl=>
new City
{
cl.IdCity,
cl.NameCity,
cl.IdState,
companyList=companyList.Where(comp=>
comp.IdState==cl.IdState && comp.IdCity==cl.IdCity)
}
});
使用LINQ,您可能希望将私有IList转换为公共IList(或List、IEnumerable或IQueryable),以便直接设置它们 假设finalList已经预先填充了状态:
var finalList=finalList
.Select(fl=>new State
{
fl.IdState,
fl.NameState,
cityList=cityList.Where(cl=>cl.IdState==fl.IdState).Select(cl=>
new City
{
cl.IdCity,
cl.NameCity,
cl.IdState,
companyList=companyList.Where(comp=>
comp.IdState==cl.IdState && comp.IdCity==cl.IdCity)
}
});
我在City和State类中添加了2个方法。如果列表是公共的,则会更容易:
public void AddCities(List<City> cities)
{
cityList.Concat(cities);
}
public void AddCompanies(List<Company> companies)
{
companyList.Concat(companies);
}
我首先将公司添加到正确的城市,然后添加正确状态下的所有城市。
如果您需要更多关于此代码的解释,请随时询问。我在City和State类中添加了两个方法。如果列表是公开的,则会更容易:
public void AddCities(List<City> cities)
{
cityList.Concat(cities);
}
public void AddCompanies(List<Company> companies)
{
companyList.Concat(companies);
}
我首先将公司添加到正确的城市,然后添加正确状态下的所有城市。
如果您需要更多关于此代码的解释,请随时提问。这根本不需要。您只需执行查询以查看添加了什么,然后通过
foreach添加它们,正如我在回答中所示。虽然您当然可以提供一种一次添加多个值的方法,但这肯定不是必需的。我没有说我可以他说他想用LINQ做这件事,forEach不是LINQ,而是IEnumerable的方法。那么这不是问题的答案,充其量只是一个注释。forEach
不是任何方法,而是一个语言关键字。你是对的,它不是LINQ。你除了使用一个LINQ查询,通常情况下大部分LINQ查询都是这样。ForEach当您使用它时,它不是一个关键字,而是一个列表方法(对不起,我以为它是IEnumerable,但实际上是List).foreach,因为他使用它是一个关键字。我根本没有使用列表的foreach
方法。我只是使用foreach
关键字。我从不使用foreach
。我会让Eric Lippert。这根本不需要。您只需执行一个查询,查看添加了什么,然后通过foreach
添加它们,正如我所示d在我的回答中。虽然你当然可以提供一种一次添加多个值的方法,但这肯定不是必需的。我没有说这是必需的,只是说他想这么做。他说他想用LINQ来做,而forEach不是LINQ,它是IEnumerable的一种方法。那么这不是问题的答案,充其量只是一个评论de>foreach
不是任何方法,它是一个语言关键字。你是对的,它不是LINQ。你将在LINQ查询之外使用它,就像通常对大部分LINQ查询所做的那样。foreach当你使用它时,它不是一个关键字,而是一个列表方法(对不起,我以为它是IEnumerable,但实际上是List).foreach,因为他使用它是一个关键字。我根本没有使用列表的foreach
方法。我只是使用了foreach
关键字。我从来没有使用过foreach
。我会让Eric Lippert。谢谢Servy,我一回到家就会尝试,我会告诉你我已经在我的虚拟应用程序中尝试过这段代码,它工作得非常好.@It'sNotALie.Naturally.@Servy正如所料,将代码放入实际项目中需要一些微调(事实上,我根本不需要修改您的代码).如果可以的话,我会吻你的。干得好。关于foreach vs foreach也有很好的提示。再一次,非常感谢,我想是时候读一些Linq的书了。有什么建议吗?@s.O。不太好。关于重新实现它非常有趣,他当然有很多关于Linq和其他有趣话题的帖子,但其中一些是b它更高级。谢谢Servy,我一到家就会尝试,我会告诉你我已经在我的虚拟应用程序中尝试了这段代码