2009-02-11 104 views
0

提取文本我有一個IEnumerable<T>收集與名稱,全名及地址。從IEnumerable <T>

的地址如下:

Street1=54, Street2=redfer street, Pin=324234 
Street1=54, Street2=fdgdgdfg street, Pin=45654 
Street1=55, Street2=tryry street, Pin=65464 

我想遍歷這個集合並打印那些名字,FullNames其Street1 = 54

我如何能做到這一點的LINQ?

好,我是能夠做到這一點,以提取地址Street1現在

coll.Address.Split(",".ToCharArray())[0]returns me Street1=54 . 

我怎麼添加這個病情及打印只有那些名字,全名,其Street1 = 54

回答

2

根據您的更新,可以適應賈裏德面值的代碼是這樣的:

var result = collection.Where(x => x.Address.Contains("Street1=54")); 
foreach (var cur in result) { 
    Console.WriteLine(string.Format("{0}, {1}", cur.Name, cur.FullName)); 
} 

如果你希望能夠與可變你Street1值堵塞,那麼這樣做:

var street1 = "54"; 
var result = collection.Where(x => x.Address.Contains("Street1=" + street1)); 
foreach (var cur in result) { 
    Console.WriteLine(string.Format("{0}, {1}", cur.Name, cur.FullName)); 
} 

順便說一句,你真的應該更新您的問題或添加到一個具體的答案評論,而不是增加新的答案是不。

+0

好吧我今後會更新我的問題 – Viks 2009-02-11 15:55:43

+0

我可以這樣做嗎? var result = collection.Where(x => x.Address.Contains(「Street1 =」+ street1))。OrderByDescending(x => x.Name.Length); – Viks 2009-02-11 16:11:06

1

試試這個

var result = collection.Where(x => x.Address.Street1==54); 
foreach (var cur in result) { 
    Console.WriteLine(var.Name); 
} 
0

選擇的正確的列表:

IList<T> matches = myListOfEnumerables.Where(m => m.Street1 == 54).ToList(); 

然後循環和打印。

+0

如果您要做的只是循環轉發一次結果,則不需要IList,因此您不需要.ToList()。參見JaredPar的答案。 – 2009-02-11 15:40:22

0

其實記錄看起來是這樣的:

{Name="Jan" FullName="Kathy Jan" Address="Street1=54, Street2=redfer street, Pin=324234"} 

我不得不遍歷這個集合並打印那些名字,FullNames其Street1 = 54

0

如果更新的信息是準確的,你應該改變您存儲數據的方式。

看起來你已經擠滿了地址信息轉換成字符串。爲什麼不把它作爲一個對象存儲。事實上,爲什麼不只是在與Name和FullName相同的對象中有更多的字段呢? (爲什麼重複直呼其名的信息?)

public class Person 
{ 
    public string FirstName, LastName, Street1, Street2, Pin; 
} 

IEnumerable<Person> persons = GetAllPersonsSomehow(); 

foreach (Person person in persons.Where(p => p.Street1 == "54")) 
    Console.WriteLine(person.LastName + ", " + person.FirstName); 

假設你必須保持在一個字符串的地址信息,你需要它的分析器。

public static IDictionary<string, string> GetAddressFields(string address) 
{ 
    return address.Split(',').ToDictionary(
       s => s.Substring(0, s.IndexOf('=')).Trim(), 
       s => s.Substring(s.IndexOf('=') + 1).Trim()); 
} 


foreach (Person person in persons.Where(p => 
       GetAddressFields(p.Address)["Street1"] == "54")) 
    Console.WriteLine(person.LastName + ", " + person.FirstName); 
+0

我可以做這樣的事嗎? var result = collection.Where(x => x.Address.Contains(「Street1 =」+ street1))。OrderByDescending(x => x.Name.Length); – Viks 2009-02-11 16:12:03

0

所以,你可以做的是,你可以寫一個發電機來解析地址字段,然後列舉的該屬性。這在函數式編程世界中是相當普遍的事情。

爲了公平起見,你想這個代碼是在它只會計算一組最小的懶惰。我會建議從BCL一些代碼,但你可以(並且可能應該)重寫搭配發電機使用相同的輔助方法。

public static IEnumerable<KeyValuePair<string,string>> NameValueSplit(this string s) 
{ 
    foreach (var x in s.Split(',')) 
    { 
     var y = x.Split(new char[] { '=' }, 2, StringSplitOptions.None); 
     yield return new KeyValuePair<string, string>(y[0].TrimStart(), y[1].TrimEnd()); 
    } 
} 

隨着你可以寫這樣的代碼

var result = collection.Where(x => x.Address 
    .NameValueSplit().Any(x => x.Key == "Street1" && x.Value == "54")); 
foreach (var item in result) 
{ 
    Console.WriteLine(item.Name); 
} 

現在,如果你正在考慮的這個代碼將不會在SQL Server上運行的輔助功能,但你可以寫一個WHERE子句,你會在地址字段中搜索子字符串%Street1 = 54%。我喜歡對字符串操作進行懶惰評估,並認爲這是BCL中缺乏的功能。這就是爲什麼我提出這種解決方案。

相關問題