2012-03-26 38 views
1

我有一个List<NameClass>,它存储NameClass项目的一个集合,并在该类中有一个名为Name的属性。我想要做的是编写一个Linq查询,它将提取所有以Jones开头的名称,但仅限于出现3次或更多次的情况。例如,如果我的列表有以下项目:需要LINQ查询来查找字符串项目

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

我要寻找一个C#的功能,我可以这样调用:

GetNames("Jones"); 

它应该返回:

Jones 
Jonestown 
Jones 

如果我运行这个:

GetNames("Smith"); 

它应该返回:

Smith 
Smith 
Smith 

如果我运行此:

GetNames("Hector"); 

应该因为Hector返回任何3周或更多的时间是不是在列表中。

任何帮助写这个LINQ查询,将不胜感激!

+2

如果这是家庭作业,请添加标签 “功课”。 – Robaticus 2012-03-26 20:11:39

+0

它不是作业 – Icemanind 2012-03-26 20:13:45

+0

没有进攻的OP,但他肯定不像一个学校的孩子从图片;-) – KingCronus 2012-03-26 20:18:00

回答

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; 
} 
+0

我喜欢你得到结果的方式。也许做一些像:return results.Count> = 3?结果:新列表();而不是if-else – Killnine 2012-03-26 20:36:07

+0

当你发生太多事情时 - 比如检查结果是否也可能为空,那么将所有内容放在一行中会使得内容不可读。我们经常处理庞大的代码库,是更详细的帮助。返回空列表只是浪费资源,我宁愿让自己期待'空'结果,因为这是一个更好的做法。 ?运营商绝对有其地位,我经常使用它。 – 2012-03-26 21:02:42

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); 
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]; 
} 
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>(); 
} 
1

A “一个班轮”:

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