我有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查询的帮助都将不胜感激!
答案 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();
}