C#: accesarea Dicționar prin utilizarea parțială clasa

0

Problema

Încerc să accesez un Dicționar în felul următor, prin utilizarea parțială clasa. La sfârșitul scopul este de a expune acest dicționar și permite diferite metode pentru a citi/scrie din/la ea.

FilenameABC.cs are acest cod, care pare a fi OK pentru mine până acum:

namespace Namespace1
{
    partial class ClassA
    {
        public class ExampleDictionary
        {
            private Dictionary<int, string> _dict;

            public ExampleDictionary()
            {
                _dict = new Dictionary<int, string>();
            }
        }
    }
}

FilenameDEF.cs are acest cod, și acest lucru este în cazul în care sunt dificultăți. Nu sunt sigur de ce .Adaugă metode nu funcționează. În primul încerc să-l folosească doar după crearea unui exemplu din ExampleDictionary clasa, care pare a fi destul de contra-intuitiv (având în vedere nivelul actual de cunoștințe, desigur). În cea de-a doua, am încercat să adăugați elemente din interiorul unei metode, care este

namespace Namespace1
{
    partial class ClassA
    {
        ExampleDictionary instanceOfDict = new ExampleDictionary();
        instanceOfDict.Add(1, "Test1"); // This does not work

        public static void FunctionA()
        {            
            for (int i = 0; i < 10; i++)
            {
            string text = $"Test{i}";
            instanceOfDict.Add(i, text); // This does not work as well              
            }          
        }
    }
}

Ar putea cineva ajuta, te rog?

2
1

Metoda statică FunctionA nu pot accesa exemplu membrii ClassA.

Fie schimba FunctionA a fi non-statice sau de a face dicționarul câmp static.

2021-11-22 16:28:57
1

Încă nu pot spune ceea ce vrei să faci. Dar voi face meu cel mai bun să-ți arăt niște lucruri.

Eu iau aceasta propozitie ai scris: "La sfârșitul scopul este de a expune acest dicționar și permite diferite metode pentru a citi/scrie din/în ea." ca ghidul meu

Parțială Clasa De Probleme

După cum am menționat în comentarii: nu există un astfel de lucru ca o Parțială Clasa. Cuvântul cheie parțială pur și simplu indică faptul că o clasă poate fi definită în mai mult de un fișier. Definirea normelor pentru clasa rămân aceleași, doar că unii dintre membrii clasei poate fi definit într-un fișier și alte părți, în alte fișiere.

Problemele pe care le au aici au nimic de-a face cu partial cuvinte cheie.

Două // Acest lucru nu funcționează Note

Primul se pare ca acest lucru:

partial class ClassA
{
    ExampleDictionary instanceOfDict = new ExampleDictionary();
    instanceOfDict.Add(1, "Test1"); // This does not work
    //other code
}

Prima linie declară membru privat domeniul ClassA nume instanceOfDict și se inițializează. De aceea se compilează.

Cea de-a doua linie încearcă să pună runnable cod (un apel de funcție) direct în partea de sus-domeniul de aplicare la nivel de clasă. Nu poți face asta. Poti pune o gramada de lucruri la nivel de top în domeniul de aplicare al unei clase (de exemplu, câmpuri, proprietăți, metode, delegați, enum, clase interioare), dar nu poti pune codul de acolo.

A doua problema se pare ca acest lucru:

public static void FunctionA()
{            
    for (int i = 0; i < 10; i++)
    {
        string text = $"Test{i}";
        instanceOfDict.Add(i, text); // This does not work as well              
    }          
}

Tulb este un static metoda. instanceOfDict este un teren privat de clasa, care nu sunt declarate static. Nu te poti referi la o instanta la nivel de membri (metode, proprietăți, domenii, ...) de la o metodă statică. Citiți pe static cuvinte cheie.

Crearea unei Clase care în mod Selectiv Expune un Dicționar

Când vrei să faci un dicționar de muncă în interiorul unei clase, dar expune la exterior, m-am dus la capăt și mi-class generic pe <TKey, TValue> astfel încât acesta funcționează cu Dicționare de orice tip.

Am făcut, de asemenea, pune în aplicare Colecție de Inițializare Model , astfel încât să puteți inițializa instanțe din clasa ta doar ca a fost un dicționar.

Pentru a utiliza Colecție de Inițializare Model, clasa trebuie să facă pentru lucruri:

  1. Punerea în aplicare IEnumerable sau IEnumerable<T> (T poate fi de orice tip, nu doar tipul de colectare - puteți chiar și doar arunca o NotImplementedException dacă nu-ți pasă)

  2. Include o metodă care se pare ca public void Add (SomeType atLeastOneParameter). Puteți avea mai mult de o suprasarcină de Add dacă vrei.

Deci, am început cu acest lucru (Rețineți că acesta pune în aplicare IEnumerable<T>:

public partial class TestExposedDictionary<TKey, TValue> : IEnumerable<TValue>
{
    private readonly Dictionary<TKey, TValue> _theDictionary = new Dictionary<TKey, TValue>();

    public void Add(TKey key, TValue value)
    {
        _theDictionary.Add(key, value);
    }

    public IEnumerator<TValue> GetEnumerator()
    {
        foreach (var kvp in _theDictionary)
        {
            yield return kvp.Value;
        }
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

Asta e suficient pentru a face o clasa cea mai mare parte arata ca un dicționar (ta, probabil, doriți să adăugați o modalitate de a obține date, etc. Dar, care este de până la tine (probabil că doriți să aveți un indexer (pe TKey) și o TryGetValue.

Dar, hai să adăugați ceva mai mult aleatoare functionalitate la clasa (pune asta la nivel de top în domeniul de aplicare al clasei):

    public int Count => _theDictionary.Count;

    public IEnumerable<KeyValuePair<TKey, TValue>> GetKeyValuePairs()
    {
        foreach (var kvp in _theDictionary)
        {
            yield return kvp;
        }
    }

Care vă va permite să vedeți cât de multe lucruri sunt în dicționar și permite să itera peste articole ( KeyValuePairs) că Dicționarul colecții. Simțiți-vă liber pentru a adăuga mai multe caracteristici.

În cele din urmă, pentru a testa acest lucru...

public static void Test()
{
    var testDict = new TestExposedDictionary<int, string> {
        {1, "one" },
        {5, "five" },
        {8, "eight" },
        {10, "ten" },
        {105, "hundredFive" },
    };

    // I can call Add in the normal way as well:
    testDict.Add(300, "threeHundred");

    Console.WriteLine($"TestDict Count: {testDict.Count}");
    foreach (string s in testDict)
    {
        Console.WriteLine(s);
    }
}

Atunci când am rula acest cod, am obține:

TestDict Count: 6
one
five
eight
ten
hundredFive
threeHundred

Divizarea acest lucru, folosind Parțială

Nu știu de ce doriți să o utilizați partial class. În mod normal, acest lucru este făcut pentru a avea două bucăți de cod care sunt editate/întreținute de diferite personalități (tipic motiv este pentru Visual Studio templating/vrajitorilor mecanism pentru a menține o parte a partial class și programator celelalte.

Regulile sunt destul de simple, pur și simplu să declare public partial class MyClass în două fișiere. Cele două fișiere trebuie să fie în același proiect (de exemplu, compilate în același Asamblare) și clase trebuie să fie în același spațiu de nume. Odată ce ai făcut asta, doar split (partea de sus la nivel de aplicare) biți și piese de pe cele două partial class declarații.

În aceste cazuri, probabil că aș împărți-o în acest fel:

  • Unul de o parte, aș pune două funcții necesare pentru punerea în aplicare declarate IEnumerator<TValue>:
    • public IEnumerator<TValue> GetEnumerator()
    • IEnumerator IEnumerable.GetEnumerator()
  • Pe de altă parte, aș pune totul altceva:
    • Dicționar declarație și intialization
    • Alte enumerator: public IEnumerable<KeyValuePair<TKey, TValue>> GetKeyValuePairs()
    • public int Count => _theDictionary.Count;
    • public void Add(TKey key, TValue value)
2021-11-23 01:45:02

Eu nu pot exprima cât de recunoscător sunt pentru acest lucru. Acest lucru, de asemenea, m-a ajutat să rupă câteva concepții greșite-am avut. Uneori, să învețe programare devine un dar frustrant, dar din fericire sunt uimitoare indivizi ca tine, care dedica o parte din zi pentru a ajuta pe alții. Multumesc din nou!
roccaforte

Da, eu fac. Din fericire, am realizat această insignă care-mi permite ca un nou-venit pentru a începe de tranzacționare astfel de moneda. :-)
roccaforte

În alte limbi

Această pagină este în alte limbi

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................