2011-06-03 13 views
5

मैं उपयोगकर्ता के लिए प्रदर्शित करने के लिए वस्तुओं की एक सूची है। असल में, यह उपयोगकर्ता द्वारा अनुमतियों का एक सेट है। मैं उपयोगकर्ताओं के साथ पंक्तियों के रूप में कॉलम और क्रियाओं के रूप में एक तालिका प्रदर्शित करना चाहता हूं। फिर अनुमति उपयोगकर्ता और कार्रवाई के बीच छेड़छाड़ पर प्रदर्शित की जाएगी।डेटा संरचना स्तंभ और पंक्ति स्ट्रिंग अनुक्रमणिका द्वारा अनुक्रमित डाटा रखने की

मैं एक तरह से एक सी # डेटा संरचना में इस डेटा का प्रतिनिधित्व करने के लिए देख रहा हूँ। यह उपयोगकर्ता (स्ट्रिंग) और एक्शन (स्ट्रिंग) का उपयोग करने के साथ-साथ प्रत्येक "सेल" के लिए डिफ़ॉल्ट मान प्रदान करने की अनुमति देगा। आदर्श रूप से, यह स्वचालित कॉलम निर्माण के साथ ग्रिड नियंत्रण से बंधेगा।

एक सरणी बहुत अच्छा होगा लेकिन यह केवल अनुक्रमित के रूप में पूर्णांक अनुमति देते हैं। जब कोई नई पंक्ति/कॉलम जोड़ा जाता है तो उसे सरणी को पुनर्निर्माण और प्रतिलिपि बनाने की भी आवश्यकता होगी।

मैं एक Dictionary<String, Dictionary<String, Permission>> वस्तु बनाने के बारे में सोचा था, लेकिन यह त्रुटि जाँच का एक बहुत आवश्यकता है और datagrid नियंत्रण के साथ अच्छी तरह से काम नहीं करता।

वहाँ एक मौजूदा (खुला स्रोत?) डेटा संरचना उस तरह के लिए परियोजना है? असल में, यह "दो-चाबियों के साथ मूल्य" संरचना का एक उन्नत संस्करण है।

आप

+0

मैं शायद कहना [यहां] जाँच जा रहा था (http://stackoverflow.com/questions/5382299/पुनर्प्राप्ति-आइटम-से-कस्टम संग्रह का/5382893 # 5382893) एक विचार के लिए है, लेकिन मुझे यकीन है कि यह जब से तुम प्रत्येक कुंजी के लिए एक ही प्रकार के प्रयोग कर रहे हैं अपने उद्देश्यों फिट होगा नहीं हूँ। आपको किसी अन्य तंत्र के माध्यम से इसे असंबद्ध करना होगा। –

+0

@ एंथनी पेग्राम धन्यवाद लेकिन मेरे मामले में, मूल्य प्राप्त करने के लिए दोनों कुंजी आवश्यक हैं। –

+1

मैं समझता हूं कि ज़रूरत है, यह सिर्फ इतना है कि एक प्रकार साझा करने वाली चाबियाँ इसे थोड़ा अलग बनाती हैं। आप 'GetByUser' और 'GetByAction' विधियों के साथ एक कस्टम संग्रह लिखना बहुत अच्छी तरह से समाप्त कर सकते हैं, उदाहरण के लिए, एक इंडेक्सर का उपयोग करने के रूप में काम नहीं करेगा। –

उत्तर

3

धन्यवाद आप एक डेटा संरचना है कि स्वचालित स्तंभ पीढ़ी के साथ ग्रिड नियंत्रण के लिए अनुकूल है चाहते हैं, तो अपनी पसंद के डेटा संरचना एक DataTable है। एक DataTable पंक्तियों और स्तंभों द्वारा व्यवस्थित डेटा की गतिशील द्वि-आयामी सरणी की तरह है जो आप चाहते हैं। यदि तथ्य है कि कॉलम स्ट्रिंग द्वारा अनुक्रमित हैं, जो भी आप चाहते हैं। स्ट्रिंग द्वारा DataTable की पंक्तियों को संबोधित करने का कोई तरीका ढूंढने के लिए हमें बस इतना करना होगा और हम सभी सेट हो जाएंगे!

यहाँ एक PermissionMap जो एक DataTable ताकि आप ग्रिड नियंत्रण के साथ इसका इस्तेमाल कर सकते हैं के एक कार्यान्वयन है, लेकिन यह भी कुछ बुनियादी सुविधाओं के दो तार द्वारा अनुक्रमण का समर्थन किया है। सटीक दृष्टिकोण अलग-अलग हो सकते हैं, लेकिन मूल विचार एक DataTable के साथ शुरू और फिर जोड़ने के लिए है:

  • एक निर्माता है कि उपयोगकर्ता के कार्यों की आपूर्ति
  • नए उपयोगकर्ताओं को डिफ़ॉल्ट अनुमतियाँ जोड़ सकते हैं और स्थापित करने के लिए एक AddUser विधि
  • 012: उपयोगकर्ता और कार्रवाई

यहाँ से

  • एक दो पैरामीटर इंडेक्सर पाने के लिए और अनुमतियां सेट एक नमूना कार्यान्वयन है
    public enum Permission 
    { 
        Default = 0, 
        Disallow = 0, 
        Allow = 1, 
    } 
    
    public class PermissionMap : DataTable 
    { 
        private Dictionary<string, int> actionMap = new Dictionary<string, int>(); 
    
        public PermissionMap(IEnumerable<string> actions) 
        { 
         Columns.Add(new DataColumn("Action")); 
         int i = 0; 
         foreach (var action in actions) 
         { 
          actionMap.Add(action, i++); 
          var row = NewRow(); 
          row["Action"] = action; 
          Rows.Add(row); 
         } 
        } 
    
        public void AddUser(string user) 
        { 
         Columns.Add(new DataColumn(user)); 
         foreach (DataRow row in Rows) 
          row[user] = Permission.Default; 
        } 
    
        public Permission this[string user, string action] 
        { 
         get { return (Permission)Rows[actionMap[action]][user]; } 
         set { Rows[actionMap[action]][user] = value; } 
        } 
    } 
    

    और यहाँ एक छोटे से प्रदर्शन कार्यक्रम है:

    class Program 
    { 
        static void Main(string[] args) 
        { 
         var permissionMap = new PermissionMap(new[] { "Read", "Write" }); 
         permissionMap.AddUser("Bill"); 
         permissionMap.AddUser("Jane"); 
         permissionMap["Bill", "Read"] = Permission.Allow; 
         permissionMap["Jane", "Write"] = Permission.Allow; 
         foreach (DataColumn column in permissionMap.Columns) 
         { 
          Console.Write(column.ColumnName); 
          Console.Write(","); 
         } 
         Console.WriteLine(); 
         foreach (DataRow row in permissionMap.Rows) 
         { 
          foreach (DataColumn column in permissionMap.Columns) 
          { 
           Console.Write(row[column]); 
           Console.Write(","); 
          } 
          Console.WriteLine(); 
         } 
         Console.ReadKey(); 
        } 
    } 
    

    जो इस उत्पादन का उत्पादन:

    Action,Bill,Jane, 
    Read,Allow,Disallow, 
    Write,Disallow,Allow, 
    
  • +0

    आप सर एक उपन्यास के लायक हैं। आपका बहुत बहुत धन्यवाद ;) –

    संबंधित मुद्दे