【问题标题】:Decipher LINQ to Objects query involving strings解密涉及字符串的 LINQ to Objects 查询
【发布时间】:2014-08-10 04:10:23
【问题描述】:

(免责声明:我是 LINQ 的新手,我确实做了功课,但我所有的研究都提出了直接处理字符串的示例。我的代码处理 ObservableCollection 的对象,其中每个对象都包含一个字符串。 )

我有以下代码:

public class Word
{
    public string _word { get; set; }
    // Other properties.
}

ObservableCollection<Word> items = new ObservableCollection<Word>();

items.Add(new Word() { _word = "Alfa" });
items.Add(new Word() { _word = "Bravo" });
items.Add(new Word() { _word = "Charlie" });

我正在尝试查找其中包含“r”的单词:

IEnumerable<Word> subset = from ii in items select ii;
subset = subset.Where(p => p._word.Contains("r"));

上述工作(我得到“Bravo”和“Charlie”)。

我的问题:我根据我在网上/书中找到的零碎示例设计了上述 LINQ 查询。

  1. 它是如何做到的?
  2. 有没有更好/更直接的方法?

谢谢。

【问题讨论】:

  • 您正在混合查询和方法语法。顺便说一句,你为什么要一个类Word 和一个属性-word 呢?另外,请关注.NET Naming Conventions
  • @TimSchmelter 该类包含其他属性,正如我在评论中显示的那样 - 我没有在这里详细说明它们。另外,您能否扩展您的评论:查询/方法语法?哪个是哪个?
  • 查询语法:var query = from item in collection 方法语法:var query = collection.Select(item =&gt; item)。这里有一个关于利弊的问题:stackoverflow.com/questions/214500/…
  • @TimSchmelter 谢谢。

标签: c# linq-to-objects


【解决方案1】:

你可以像下面这样更简单地实现你想要的:

IEnumerable<Word> subset = items.Where(x => x._word.Contains("r"));

通过上述 linq 查询,您可以使用名为 Where 的扩展方法过滤名为 items 的集合。 items 集合中满足Where 方法中的过滤器的每个元素,都将包含在subset 中。在 Where 中,您已经使用 lambda 表达式定义了您的 fitler。在=&gt; 的左侧你有你的输入-items 的随机元素,而在=&gt; 的右侧你有你的输出,在你的情况下将是truefalse。在=&gt; 的右侧,您使用名为Contains 的字符串方法,简单来说,它检查您作为参数传递给此方法的字符串是否包含在元素x 的名为_word 的属性中.

【讨论】:

  • 是的,这行得通,谢谢。但是Where 是扩展方法吗?我的印象是扩展方法是您自己定义的方法。对不起,如果这是一个愚蠢的问题。
  • WhereEnumerable类中定义的扩展方法,但是@Christos对Contains方法是错误的,它是String类的普通成员方法。您可以在此处阅读有关扩展方法的信息:msdn.microsoft.com/en-us/library/bb383977.aspx
  • @frankkoch 哎呀,你是对的。感谢您指出这一点。
  • @frankkoch 谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-14
  • 1970-01-01
  • 2017-03-17
  • 1970-01-01
相关资源
最近更新 更多