2012-03-26 40 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; 
}