2015-09-21 50 views
0

我在c#中有一個窗體窗體應用程序,我正在顯示一個字典。在C#Windows窗體中對字典進行排序

我想要做的是對字典進行排序。

在字典中有文件路徑以及字典中有多少次的值。我想排序清單,讓出現在頂部和底部最低的條目

我不知道從哪裏開始。

這是我的代碼的時刻:

namespace Xml_reader 
{ 
    public partial class Form1 : Form 
    { 
     Dictionary<string, int> _dictionary = new Dictionary<string, int>(); 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void getFile_Click(object sender, EventArgs e) 
     { 
      FileStream fileStream = null; 
      fileStream = new FileStream(@"C:\myProject\svn.xml", FileMode.Open, FileAccess.Read, FileShare.Read); 


      XmlSerializer xmlSerializer = new XmlSerializer(typeof(log)); 
      log logInstance; 
      lock (xmlSerializer) 
      { 
       logInstance = (log)xmlSerializer.Deserialize(fileStream); 
      } 
      _dictionary = CreateDictionary(logInstance); 
     } 

     private Dictionary<string, int> CreateDictionary(log logInstance) 
     { 
      Dictionary<string, int> dictionary = new Dictionary<string, int>(); 
      int commonStringNumber = FindCommonString(logInstance); 
      for (int entryIdex = 0; entryIdex < logInstance.logentry.Count(); entryIdex++) 
      { 

       logLogentry entry = logInstance.logentry[entryIdex]; 

       for (int pathIdex = 0; pathIdex < entry.paths.Count(); pathIdex++) 
       { 
        logLogentryPath path = entry.paths[pathIdex]; 
        string filePath = path.Value; 


        if (filePath.Length >= commonStringNumber) 
        { 
         string cutPath = filePath.Substring(commonStringNumber); 
         if (dictionary.ContainsKey(cutPath)) 
         { 
          dictionary[cutPath]++; 
         } 
         else 
         { 
          dictionary.Add(cutPath, 1); 
         } 
        } 
       } 
      } 
      return dictionary; 
     } 

     private static int FindCommonString(log logInstance) 
     { 
      string fCompare = logInstance.logentry[0].paths[0].Value; 
      for (int entryIdex = 0; entryIdex < logInstance.logentry.Count(); entryIdex++) 
      { 
       logLogentry entry = logInstance.logentry[entryIdex]; 

       for (int pathIdex = 0; pathIdex < entry.paths.Count(); pathIdex++) 
       { 
        logLogentryPath path = entry.paths[pathIdex]; 
        string fcheck = path.Value; 
        fCompare = similarString(fCompare, fcheck); 


       } 

      } 
      return fCompare.Length; 
     } 

     private static string similarString(string fCompare, string fcheck) 
     { 
      int length = Math.Min(fCompare.Length, fcheck.Length); 
      string common = String.Empty; 
      for (int i = 0; i < length; i++) 
      { 

       if (fCompare[i] == fcheck[i]) 
       { 
        common += fCompare[i]; 
       } 
       else 
       { 
        break; 
       } 
      } 
      return common; 
     } 

     private void converToText(Dictionary<string, int> dictionaryList) 
     { 
      List<KeyValuePair<string, int>> changesWithValues = dictionaryList.ToList(); 
      display(changesWithValues); 
     } 

     private void display(List<KeyValuePair<string, int>> changesWithValues) 
     { 
      textBox1.Text = String.Join(Environment.NewLine, changesWithValues.Where(kvp => kvp.Key != "").Select(kvp => string.Format("{0} = {1}", kvp.Key, kvp.Value))); 
     } 

     private void Show_Click(object sender, System.EventArgs e) 
     { 
      converToText(_dictionary); 
     } 

回答

2

你可以試試這個:

List<KeyValuePair<string, int>> myList = _dictionary.ToList(); 

myList.Sort((firstPair,nextPair) => 
    { 
     return firstPair.Value.CompareTo(nextPair.Value); 
    } 
); 

讓我們做一些測試。有了這個代碼:

_dictionary.Add("Toto", 33); 
_dictionary.Add("Tutu", 22); 
_dictionary.Add("Pouet", 2); 
_dictionary.Add("Pouetr", 57); 


List<KeyValuePair<string, int>> myList = _dictionary.ToList(); 

myList.Sort((firstPair, nextPair) => firstPair.Value.CompareTo(nextPair.Value)); 
myList.Reverse(); 

foreach (KeyValuePair<string, int> keyValuePair in myList) 
{ 
    Console.Out.WriteLine(keyValuePair.Value + " " + keyValuePair.Key); 
} 

我得到:

57 Pouetr 
33 Toto 
22 Tutu 
2 Pouet 

所以,從技術上說,它的工作...

+0

這似乎只能說明只有一個條目我已經有了喜歡的代碼項this:private void display(List > changesWithValues) { List > myList = changesWithValues.ToList(); myList.Sort((firstPair,nextPair)=> { return firstPair.Value.CompareTo(nextPair.Value); } ); (kvp => kvp.Key!=「」).Select(kvp => string.Format(「{0} = {1}」,kvp。 Key,kvp.Value))); } –

+0

@FraserMunro請編輯你的問題,當你想添加代碼 –

+0

有了這個答案,你給了@Thomas顯示器只有一個值 –