2014-09-12 37 views
1

我拼命想了解LINQ,我现在有什么,我想做的事情(和失败)一个具体的例子:C#的LINQ问题

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

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

我以为我不需要一个循环来完成上述操作,但是当上面的代码被重新写入工作时,它可能仅仅是第一次打开它而已?

我想要执行的问题是:
对于字典中SortType设置为110的每个条目,打印出它的邮政编号。

+2

尝试张贴在计算器 – 2014-09-12 09:15:14

+0

http://meta.stackexchange.com/a/129632/165773 – gnat 2014-09-12 09:27:54

+0

@TomSquires ** [“跨过帐皱眉.. 。“](http://meta.stackexchange.com/tags/cross-posting/info)** – gnat 2014-09-12 10:11:46

回答

2

下面是一个方法来此的一步一步的演练。

要设置样本数据(根据你的问题),我们有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所以我们的查询更改为:

​​

Value包含OneAddress对象,我们只能得到我们需要(在IEnumerable<T>)的财产。

但是,这是为集合中的所有项目;我们现在可以添加我们的滤镜。

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

现在我们得到了PostalNr在字典其中SortType"110"任何OneAddress,那只剩结果打印到控制台屏幕。

在其他的答案强调,Console.WriteLine()不字符串枚举列表的工作,所以我们可以列举的项目:

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

或者(如果我们使用System.Collections.Generic)我们可以做一个行:

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

我无法添加评论,因为我的声望很低。

你的问题不是linq本身,而是你如何使用它。你在做什么是打印一行。该行将包含列表/集合/ linq结果上的ToString调用的值。我认为如果你不尝试把所有东西放在一条线上,它可能会对你有所帮助。如果从写入行提取linq查询,该错误应该很明显。

我没有一个IDE在这里我的工作场所,所以我不能确定我的代码工作,但你想要做的基本上是:

var addresses = (from myaddresses[x].PostalNr where x => myaddresses[x].SortType == "110") 
addresses.each(Console.WriteLine) 
2

LINQ查询你正在寻找采取的形式: -

from <item> in <collection> where <item.someclause> select <item.targetfield> 

这将返回一个IEnumerable<targetfieldtype>Console.WriteLine不处理。

如果类型是一个字符串,那么您可以应用string.join()将它连接成单个字符串。

像这样: -

Console.WriteLine 
(
    string.Join 
    (
     "\r\n", 
     from address in Addresses 
     where address.SortType=="110" 
     select address.PostalNr 
    ) 
);