2011-03-30 132 views
2

我是LINQ新手,致力於涉及國際郵政地址的GIS項目。我的一個設計問題涉及按國家/地區動態地將分解的鍵/值對格式的地址數據轉換爲多行郵政地址格式。每個記錄都需要基礎上,Country字段值自撰寫,根據按國家和地址線定義了一組規則:LINQ條件級聯查詢

Dictionary<string, string> addressOne = new Dictionary<string,string>() { 
    { "StreetName", "Stradă Măguricea" }, 
    { "HouseNumber", "1" }, 
    { "ApartmentLabel", "Ap" }, 
    { "ApartmentNumber", "17" }, 
    { "PostalCode", "014231" }, 
    { "City", "BUCUREŞTI" }, 
    { "Country", "Romania" } 
}; 

Dictionary<string, string> addressTwo = new Dictionary<string,string>() { 
    { "StreetName", "PORTAGE" }, 
    { "StreetSuffix", "AVE" }, 
    { "HouseNumber", "811" }, 
    { "City", "WINNIPEG" }, 
    { "StateProvince", "MB" }, 
    { "PostalCode", "R3B 2A8" }, 
    { "Country", "CANADA" } 
}; 

//Example Concatenation Rules (these are approximations)... 

//Romania: AddressLine1 = "{StreetName}[ {StreetSuffix}] {HouseNumber}[, {ApartmentLabel} {ApartmentNumber}" 
//   AddressLine2 = "{PostalCode} {City}" 
//   AddressLine3 = "{Country}" 

//Canada: AddressLine1 = "{HouseNumber} {StreetName}[ {StreetSuffix}]" 
//   AddressLine2 = "[{ApartmentLabel} {ApartmentNumber}]" 
//   AddressLine3 = "{City} {StateProvince} {PostalCode}" 
//   AddressLine4 = "{Country}" 

我目前正在規劃一個函數表,通過CountryAddressLine來電,與每個Func返回由適當的連接規則格式化的複合字段。我始終可以用傳統的邏輯來實現這些規則函數,但對於LINQ查詢來說,這似乎已經成熟。

我的大多數搜索與通常的comma aggregation scenarios;這更多的是選擇性的,條件模式匹配問題(我可以聞到正則表達式)。這對於LINQ來說是一個很好的用例,還是我應該堅持老派的字符串操作?

感謝您的閱讀!

+0

是每個國家會擁有自己的地址字段和值的字典?另外,將如何定義每個國家的格式(即地址線)的對象?它是一個字符串列表,每個索引都是地址行的位置?最後,方括號是可選字段嗎?或者,如果它不匹配字典中的任何鍵,它就不存在。回答這些問題應該有助於澄清一些問題。 – 2011-03-30 15:32:46

回答

1

我愛LINQ和字典:

public static IEnumerable<string> InjectFields(IDictionary<string, string> address) 
{ 
    string country = address["Country"]; 
    return formatStrings[country] 
      .Select(s => address.Aggregate(s, (acc, pair) => acc.Replace("{"+pair.Key+"}", pair.Value))) 
      .ToArray(); 
} 

private static Dictionary<string, IEnumerable<string>> formatStrings = 
      new Dictionary<string, IEnumerable<string>>(StringComparer.InvariantCultureIgnoreCase) 
        { 
         { "Romania", new[] { 
          "{StreetName}[ {StreetSuffix}] {HouseNumber}[, {ApartmentLabel} {ApartmentNumber}", 
          "{PostalCode} {City}", 
          "{Country}", 
         } }, 
         { "Canada", new[] { 
          "{HouseNumber} {StreetName}[ {StreetSuffix}]", 
          "[{ApartmentLabel} {ApartmentNumber}]", 
          "{City} {StateProvince} {PostalCode}", 
          "{Country}" 
         } }, 
        };