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

本文关键字:对象 列表 搜索 何使用 | 更新日期: 2023-09-27 18:27:28

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

class Word
{
    public string Name;//Name property
}
var words = new List<Word>();
var recognized = new List<Word>();

这是我正在尝试的代码:

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

这个代码健康吗?有没有一种方法可以在.NET中实现if(words.Contain(Name property))

谢谢。

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

这对我来说不是个好主意,不是。只需更简单(更高效)地使用LINQ:

var recognized = theSentence.Split(' ')
                            .Join(words, x => x, word => word.Name,
                                  (x, word) => word)
                            .ToList();

或者作为查询表达式:

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

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

对于该部分:

有没有一种方法可以在.NET中实现if(words.Contain(Name property))

我会创建一个新的集合:

HashSet<string> wordNames = new HashSet<string>(words.Select(x => x.Name));

然后你可以使用:

if (wordNames.Contains(...))

并且它将是O(1)运算(假设没有散列冲突等),而不是每次都必须检查每个字。

编辑:回应这一评论:

有没有一种方法可以让我获得Join找不到的集合元素,并将其放在另一个列表中,比如。。。无法识别的列表

是的-如果您对任何给定的Name只有一个Word感到高兴,或者您在Word中覆盖了EqualsGetHashCode,则可以使用:

var unrecognized = words.Except(recognized).ToList();

您当前的代码没有任何作用,如果您想在上下文中选择具有可用名称的单词,您可以按以下方式进行:

var recognized = theSentence.Split(new[] {' '})
                           .SelectMany(x=>words.Where(y=>y.Name == x))
                           .ToList();

此外,您还可以添加distinct以防止冗余数据。

您的意思是:

        if (words.Count(n => n.Name == "name") > 0)
        {
        }

假设您有一个已知单词列表:

var words = new List<Word>();

你想看看句子中有哪些单词:

string sentence = "The cat is on the table";

你所要做的就是像这样使用LINQ:

var found = sentence.Split(' ').Where(word => words.Any(known => known.Name == word));

在您的代码中,您滥用了LINQ,因为您绕过了所有LINQ的魔力,自己将元素添加到列表中。

编辑:对不起,我没看到你试图获取单词列表!在这种情况下,使用Jon Skeet建议的Join方法。或者,只需在末尾添加一个Select运算符,然后重新创建单词class:

found.Select(a => new Word() { Name = a });