C#林克问题
本文关键字:问题 林克 | 更新日期: 2023-09-27 18:21:34
我拼命想理解linq,现在我有了一个我想做什么(但失败了)的具体例子:
Console.WriteLine("{0}", (from myaddresses[x].PostalNr where x => myaddresses[x].SortType == "110" ))
myaddress
是OneAddress
对象(我自己的对象)的字典,该对象包含属性SortType
和PostalNr
。
我以为我不需要一个循环来完成上面的操作,但当上面的操作被重写时,它可能只会受到第一次点击,或者?
我想回答的问题是:
对于字典中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>
,其中T
是KeyValuePair<int, OneAddress>
(与我们的Dictionary相同)。
如上所述,您只想要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;
现在,我们得到Dictionary中任何OneAddress
的PostalNr
,其中SortType
是"110"
,这只会将结果打印到控制台屏幕上。
正如其他答案中强调的那样,Console.WriteLine()
不适用于可枚举的字符串列表,因此我们可以使用枚举项目
foreach (string postalNr in results)
{
Console.WriteLine(postalNr);
}
或者(如果我们使用System.Collections.Generic),我们可以在一行上使用:
results.ToList().ForEach(p => Console.WriteLine(p));
您要查找的LINQ查询采用以下形式:-
from <item> in <collection> where <item.someclause> select <item.targetfield>
这将返回Console.WriteLine
不处理的IEnumerable<targetfieldtype>
。
如果类型是一个字符串,那么可以应用string.join()
将其连接到一个字符串中。
像这样:-
Console.WriteLine
(
string.Join
(
"'r'n",
from address in Addresses
where address.SortType=="110"
select address.PostalNr
)
);
我不能添加评论,因为我的声誉太低了。
你的问题不在于linq本身,而在于你如何使用它。你正在做的是打印一行。此行将包含对list/collection/linq结果的ToString调用的值。我认为如果你不试着把所有的事情都放在一条线上,这可能会对你有所帮助。如果从写入行提取linq查询,那么错误应该是显而易见的。
我的工作场所没有IDE,所以我无法确认我的代码是否有效,但你想做的基本上是:
var addresses = (from myaddresses[x].PostalNr where x => myaddresses[x].SortType == "110" )
addresses.each(Console.WriteLine)