如何使用特定属性搜索对象列表

Chi*_*ata 3 .net c# collections

我正在尝试搜索List<Word>集合,Word我的类属性在哪里Name,并将包含在给定字符串数组中的每个元素添加到List<string>集合中.即.

class Word
{
    public string Name;//Name property
}

var words = new List<Word>();
var recognized = new List<Word>();
Run Code Online (Sandbox Code Playgroud)

这是我正在尝试的代码:

theSentence.Split(new[] {' '}).ToList().ForEach(s => words.Where(w => w.Name == s).ToList().ForEach(recognized.Add));
Run Code Online (Sandbox Code Playgroud)

这段代码健康吗?有没有办法if(words.Contain(Name property))在.NET中做?

谢谢.

Jon*_*eet 5

这对我来说不是一个好主意,不.只需更简单地使用LINQ(并且更有效):

var recognized = theSentence.Split(' ')
                            .Join(words, x => x, word => word.Name,
                                  (x, word) => word)
                            .ToList();
Run Code Online (Sandbox Code Playgroud)

或者作为查询表达式:

var recognized = (from x in theSentence.Split(' ')
                  join word in words on x equals word.Name
                  select word)
                 .ToList();
Run Code Online (Sandbox Code Playgroud)

(Name顺便说一句,我注意到"属性"实际上只是一个公共领域.希望它在你的实际代码中是一个真正的属性:)

对于这部分:

有没有办法if(words.Contain(Name property))在.NET中做?

我会创建一个新集:

HashSet<string> wordNames = new HashSet<string>(words.Select(x => x.Name));
Run Code Online (Sandbox Code Playgroud)

然后你可以使用:

if (wordNames.Contains(...))
Run Code Online (Sandbox Code Playgroud)

...它将是一个O(1)操作(假设没有哈希冲突等),而不是每次都要检查每个单词.

编辑:解决此评论:

有没有办法可以获得Join找不到的集合元素,并把它放在另一个列表中说...无法识别的列表

是的-如果你高兴,你只能有一个Word与任何给定的Name,或者你已经覆盖EqualsGetHashCodeWord,你可以使用:

var unrecognized = words.Except(recognized).ToList();
Run Code Online (Sandbox Code Playgroud)