来自Software Engineering Stack Exchange的

This question was migrated,因为可以在Stack Overflow上进行回答。
                            Migrated 5年前。
                        
                    
                
                            
                    
我拼命试图了解linq,现在我有一个具体的例子说明了我想做什么(失败):

Console.WriteLine("{0}", (from myaddresses[x].PostalNr where x => myaddresses[x].SortType == "110" ))


myaddressOneAddress对象(我自己的对象)的字典,并且该对象包含属性SortTypePostalNr

我以为我不需要循环就可以完成上述操作,但是当重写上面的内容以使其工作时,它可能只会遇到第一个问题?

我要执行的问题是:
对于SortType设置为110的词典中的每个条目,请打印出其邮政编码。

最佳答案

以下是此方法的分步演练。

要设置样本数据(根据您的问题),我们具有OneAddress类:

class OneAddress
{
    public string PostalNr { get; set; }
    public string SortType { get; set; }
}


这是在Dictionary中,因此我们有:

var myAddresses = new Dictionary<int, OneAddress>();
myAddresses.Add(1, new OneAddress() { PostalNr = "123", SortType = "101" });
myAddresses.Add(2, new OneAddress() { PostalNr = "124", SortType = "110" });
myAddresses.Add(3, new OneAddress() { PostalNr = "125", SortType = "101" });
myAddresses.Add(4, new OneAddress() { PostalNr = "126", SortType = "110" });
myAddresses.Add(5, new OneAddress() { PostalNr = "127", SortType = "110" });


首先,使用基本的Linq查询来获取所有字典条目:

var results = from a in myAddresses
            select a;


这将返回一个IEnumerable<T>,其中TKeyValuePair<int, OneAddress>(与我们的字典相同)。

如前所述,您只希望PostalNr而不是KeyValuePair,因此我们将查询更改为:

var results = from a in myAddresses
            select a.Value.PostalNr;


Value包含OneAddress对象,并且我们仅获得所需的属性(在IEnumerable<T>中)。

但这适用于集合中的所有项目。我们现在可以添加过滤器。

var results = from a in myAddresses
             where a.Value.SortType == "110"
            select a.Value.PostalNr;


现在我们得到字典中任何PostalNrOneAddress,其中SortType"110",仅将结果打印到控制台屏幕上。

正如其他答案中突出显示的那样,Console.WriteLine()不适用于可枚举的字符串列表,因此我们可以使用以下方式枚举项目:

foreach (string postalNr in results)
{
    Console.WriteLine(postalNr);
}


或者(如果我们使用的是System.Collections.Generic),则可以在一行中执行以下操作:

results.ToList().ForEach(p => Console.WriteLine(p));

10-07 16:03