需要LINQ查询才能找到字符串项

时间:2012-03-26 20:10:33

标签: c# linq

我有List<NameClass>存储NameClass个项目的集合,其中包含一个名为Name的属性。我要做的是编写一个Linq查询,该查询将提取以Jones开头的所有名称,但仅限于有3次或更多次出现的名称。例如,如果我的列表包含以下项目:

Name
-----------
Jones
Jonestown
Smith
Hector
Jones
Smith
Smith

我正在寻找一个C#函数,我可以像这样调用:

GetNames("Jones");

它应该返回:

Jones
Jonestown
Jones

如果我这样做:

GetNames("Smith");

它应该返回:

Smith
Smith
Smith

如果我这样做:

GetNames("Hector");

它应该不返回任何内容,因为Hector不在列表中3次或更多次。

任何编写此LINQ查询的帮助都将不胜感激!

6 个答案:

答案 0 :(得分:5)

string searchString = "Jones";
string lowerSS = searchString.ToLower();

List<NameClass> nameClasses; 

var results = nameClasses.Where(nc => nc.Name.ToLower().StartsWith(lowerSS));

if(results != null && results.Count() >= 3)
{
    return results;
}
else
{
    return null;
}

答案 1 :(得分:2)

我认为你正在寻找这样的事情,不是吗?

public static IEnumerable<NameClass> GetNames(IEnumerable<NameClass> names, String name, int minCount)
{
    var matchingNames = names.Where(n => n.Name.StartsWith(name));
    if (matchingNames.Count() >= minCount)
    {
        return matchingNames.ToList();
    }
    else
    {
        return null;
    }
}

var jones = GetNames(names, "Jones", 3);  

答案 2 :(得分:2)

你试过这个吗?

public void GetNames(string pattern)
{
    var q = from n in names
        where n.Name.StartsWith(pattern)
        select n;

    if (q.Count() >= 3)
        return q.ToList();
    else
        return new List<NameClass>();
}

答案 3 :(得分:2)

IEnumerable<NameClass> GetNames(string s, List<NameClass> list)
{
    var filtered = list.Where(l => l.Name.StartsWith(s));
    return filtered.Count() >= 3 ? filtered : null;
}

答案 4 :(得分:1)

如果您在一个查询中不需要它,则此扩展方法应该执行此操作:

public static IEnumerable<string> GetNames(this IEnumerable<string> list, string prefix, int minOccurences)
{
    var res = list.Where(x => x.StartsWith(prefix));
    return res.Count() >= minOccurences ? res : new string[0];
}

答案 5 :(得分:1)

“一个班轮”:

public string[] GetNames(MyClass[] list, string prefix)
{
    return list
        .Where(item => 
            item.Name.StartsWith(prefix) && 
            list.Count(temp => temp.Name.StartsWith(prefix)) > 2)
        .Select(l => l.Name)
        .ToArray();
}