2011-07-07 13 views
3

次の文字列を解析して結果を取得しようとしています。C#で文字列を分割する方法は?

string test = "SiteA:Pages:1,SiteB:Pages:4,SiteA:Documents:6" 

分割後に次の結果を得ようとしています。

string SiteA = "Pages:1,Documents:6" 
string SiteB = "Pages:4" 

ここは私のコードですが、動作していないようです。どのように私はすべての関連する "SiteA"と "SiteB"を得ることができますか?ここで

List<string> listItem = new List<string>(); 
string[] keyPairs = test.Split(','); 
string[] item; 
foreach (string keyPair in keyPairs) 
{ 
    item = keyPair.Split(':'); 
    listItem.Add(string.Format("{0}:{1}", item[0].Trim(), item[1].Trim())); 
} 
+0

何の結果を得ていますか?私はアイテム[0]としてSiteAと2つのアイテムがあると思います。 – Narnian

+0

.NETのどのバージョンですか? –

+0

正常に機能していないのは正常です。 2回目の解析は次のようになります。複数の部分文字列があるため、項目変数の[0]と[1]だけを保持するため、「ページ」の後に部分が失われてしまいます。 – Tipx

答えて

0

は私のコードです:ここでは

string test = "SiteA:Pages:1,SiteB:Pages:4,SiteA:Documents:6"; 
string[] data = test.Split(','); 
Dictionary<string, string> dic = new Dictionary<string, string>(); 
for(int i = 0; i < data.Length; i++) { 
    int index = data[i].IndexOf(':'); 
    string key = data[i].Substring(0, index); 
    string value = data[i].Substring(index + 1); 
    if(!dic.ContainsKey(key)) 
     dic.Add(key, value); 
    else 
     dic[key] = string.Format("{0}, {1}", new object[] { dic[key], value }); 
} 
+1

はSiteAの以前の価値をぶつかるかもしれませんか? –

+0

それはここでうまく動作します:) – platon

+0

Nevermind、私はあなたが前にそれを追加されて参照してください!私の悪い、私はそれを取り戻す:-) –

0

は、私はそれを行うだろうかです:

SortedList<string, StringBuilder> listOfLists = new SortedList<string, StringBuilder>(); 
string[] keyPairs = test.Split(','); 
foreach (string keyPair in keyPairs) 
{ 
    string[] item = keyPair.Split(':'); 
    if (item.Length >= 3) 
    { 
     string nextValue = string.Format("{0}:{1}", item[1].Trim(), item[2].Trim()); 
     if (listOfLists.ContainsKey(item[0])) 
      listOfLists[item[0]].Append(nextValue); 
     else 
     { 
      StringBuilder sb = new StringBuilder(); 
      sb.Append(nextValue); 
      listOfLists.Add(item[0], sb); 
     } 
    } 
} 

foreach (KeyValuePair<string, StringBuilder> nextCollated in listOfLists) 
    System.Console.WriteLine(nextCollated.Key + ":" + nextCollated.Value.ToString()); 
3

私はこのためLookupを使用します。

string test = "SiteA:Pages:1,SiteB:Pages:4,SiteA:Documents:6"; 
var listItemsBySite = test.Split(',') 
          .Select(x => x.Split(':')) 
          .ToLookup(x => x[0], 
            x => string.Format("{0}:{1}", 
                 x[1].Trim(), 
                 x[2].Trim())); 

あなたは次のように使用することができます:

foreach (string item in listItemsBySite["SiteA"]) 
{ 
    Console.WriteLine(item); 
} 
+0

Dohあなたと私は同じページにありますが、私は匿名タイプを使用し、あなたは文字列に変換されました:-) –

1

ここは私のソリューションです... LINQでは非常にエレガントで、匿名オブジェクト、タプル、KeyValuePair、または独自のカスタムクラスを使用できます。私はちょうど匿名のタイプを使用しています。

string test = "SiteA:Pages:1,SiteB:Pages:4,SiteA:Documents:6"; 

      var results = test 
       .Split(',') 
       .Select(item => item.Split(':')) 
       .ToLookup(s => s[0], s => new { Key = s[1], Value = s[2] }); 

      // This code just for display purposes 
      foreach (var site in results) 
      { 
       Console.WriteLine("Site: " + site.Key); 

       foreach (var value in site) 
       { 
        Console.WriteLine("\tKey: " + value.Key + " Value: " + value.Value); 
       } 
      } 
0

これは私が(テストした)ものです。

(ただし、すべての項目が正しくフォーマットされているものとします) もちろん、それは本当に最適化されていません。

static void Main(string[] args) 
{ 

    string test = "SiteA:Pages:1,SiteB:Pages:4,SiteA:Documents:6"; 

    Dictionary<String, List<String>> strings = new Dictionary<string, List<string>>(); 

    String[] items = test.Split(','); 

    foreach (String item in items) 
    { 
     List<String> itemParts = item.Split(':').ToList(); 
     String firstPart = itemParts[0]; 

     itemParts.RemoveAt(0); 
     String secondPart = String.Join(":", itemParts); 

     if (!strings.ContainsKey(firstPart)) 
      strings[firstPart] = new List<string>(); 

     strings[firstPart].Add(secondPart); 
    } 


    // This is how you would consume it 
    foreach (String key in strings.Keys) 
    { 
     List<String> keyItems = strings[key]; 
     Console.Write(key + ": "); 

     foreach (String item in keyItems) 
      Console.Write(item + " "); 
     Console.WriteLine(); 
    } 

} 
0

はここでLINQを使用してソリューションです:あなたは

string test = "SiteA:Pages:1,SiteB:Pages:4,SiteA:Documents:6"; 

var dict = test 
      .Split(',') 
      .GroupBy(s => s.Split(':')[0]) 
      .ToDictionary(g => g.Key, 
         g => string.Join(",", 
            g.Select(i => string.Join(":", i.Split(':').Skip(1))) 
            .ToArray())); 
0
using System; 
using System.Linq; 
using System.Text.RegularExpressions; 

class MyClass 
{ 
    static void Main(string[] args) 
    { 
     string test = "SiteA:Pages:1,SiteB:Pages:4,SiteA:Documents:6"; 
     var sites = test.Split(',') 
      .Select(p => p.Split(':')) 
      .Select(s => new { Site = s[0], Key = s[1], Value = s[2] }) 
      .GroupBy(s => s.Site) 
      .ToDictionary(g => g.Key, g => g.ToDictionary(e => e.Key, e => e.Value)); 

     foreach (var site in sites) 
      foreach (var key in site.Value.Keys) 
       Console.WriteLine("Site {0}, Key {1}, Value {2}", site.Key, key, site.Value[key]); 

     // in your preferred format: 
     var SiteA = string.Join(",", sites["SiteA"].Select(p => string.Format("{0}:{1}", p.Key, p.Value))); 
     var SiteB = string.Join(",", sites["SiteB"].Select(p => string.Format("{0}:{1}", p.Key, p.Value))); 

     Console.WriteLine(SiteA); 
     Console.WriteLine(SiteB); 
    } 
} 
関連する問題