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

时间:2012-03-11 13:40:04

标签: c# .net collections

我正在尝试搜索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)); 吗?

感谢。

4 个答案:

答案 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中覆盖了GetHashCodeWord },你可以使用:

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)
        {

        }