我正在尝试搜索List<Word>
集合,其中Word
是我的类,其属性为Name
,并将包含在给定字符串数组中的每个元素添加到{{1}收集。即
List<string>
这是我正在尝试的代码:
class Word
{
public string Name;//Name property
}
var words = new List<Word>();
var recognized = new List<Word>();
此代码是否健康?我有办法在.NET中做theSentence.Split(new[] {' '}).ToList().ForEach(s => words.Where(w => w.Name == s).ToList().ForEach(recognized.Add));
吗?
感谢。
答案 0 :(得分:5)
这对我来说不是一个好主意,不。只需更简单地使用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找到集合的元素并将其放入另一个列表中说...无法识别的列表
是的 - 如果您对任何给定的Word
只有一个Name
感到高兴,或者您在Equals
中覆盖了GetHashCode
和Word
},你可以使用:
var unrecognized = words.Except(recognized).ToList();
答案 1 :(得分:1)
您当前的代码没有执行任何操作,如果您希望在TheSentence中选择具有可用名称的单词,则可以执行以下操作:
var recognized = theSentence.Split(new[] {' '})
.SelectMany(x=>words.Where(y=>y.Name == x))
.ToList();
您还可以添加distinct以防止出现冗余数据。
答案 2 :(得分:1)
假设您有一个已知单词列表:
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 });
答案 3 :(得分:1)
你的意思是:
if (words.Count(n => n.Name == "name") > 0)
{
}