C#林克问题

本文关键字:问题 林克 | 更新日期: 2023-09-27 18:21:34

我拼命想理解linq,现在我有了一个我想做什么(但失败了)的具体例子:

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

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

我以为我不需要一个循环来完成上面的操作,但当上面的操作被重写时,它可能只会受到第一次点击,或者?

我想回答的问题是:
对于字典中SortType设置为110的每个条目,打印出其邮政编码。

C#林克问题

以下是一种方法的逐步演练。

为了设置样本数据(基于您的问题),我们有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>(与我们的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中任何OneAddressPostalNr,其中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)