Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.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# 转动foreach&x27的链条;用于将列表中的元素插入到linq中的另一个列表中_C#_Linq_List_Foreach - Fatal编程技术网

C# 转动foreach&x27的链条;用于将列表中的元素插入到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

我已经研究了几个小时,我得到的唯一结论是我需要拿起一本关于Linq的好书

因此,这里的交易:我有三个对象列表,属于以下类(从现在起,我将它们称为“父列表”):

    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,我一到家就会尝试,我会告诉你我已经在我的虚拟应用程序中尝试了这段代码