如何使用特定特性搜索对象列表
本文关键字:对象 列表 搜索 何使用 | 更新日期: 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
中覆盖了Equals
和GetHashCode
,则可以使用:
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 });