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中做?
谢谢.
这对我来说不是一个好主意,不.只需更简单地使用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
,或者你已经覆盖Equals
和GetHashCode
中Word
,你可以使用:
var unrecognized = words.Except(recognized).ToList();
Run Code Online (Sandbox Code Playgroud)