C#:เข้าถึงพจนานุกรมด้วยการใช้เป็นแค่ส่วนนึงของชั้นเรียน

0

คำถาม

ฉันพยายามเพื่อเข้าใช้งานเป็นพจนานุกรมตัวในวิธีดังต่อไปนี้โดยใช้บางส่วนชั้นเรียน จุดจบดประสงค์ของเรื่องนี้จะเปิดเผยเรื่องนี้พจนานุกรมและอนุญาตให้แตกต่างวิธีการโดยตรงอ่าน/เขียนอกจาก/เพื่อน

FilenameABC.à™àà§à•à£àà™ มีรจัดการโค้ดซึ่งดูเหมือนจะเป็นโอเคสำหรับฉันดังนั้นห่างไกล:

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

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

FilenameDEF.à™àà§à•à£àà™ มีรหัสและนี่คือที่ที่ฉันกำลังวามยากลำบาก. ฉันไม่แน่ใจว่าทำไม .เพิ่ม วิธีการของไม่ทำงาน ในตอนแรกผมพยายามจะใช้มันหลังจากที่กำลังสร้างเป็นตัวอย่างของ ExampleDictionary เรียนซึ่งดูเหมือนว่าจะค่อนข้างเคาน์เตอร์ intuitive(ได้รับของปัจจุบันระดับความรู้แน่นอน). ในที่สองหนึ่งฉันพยายามจะเพิ่มส่วนประกอบจากข้างในวิธีการซึ่งก็คือ

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              
            }          
        }
    }
}

อาจจะมีใครช่วย,ได้โปรด?

2
1

ไฟฟ้าสถิตย์วิธีการ FunctionA ไม่สามารถเข้าใช้งานตัวอย่างเช่นสมาชิกของ ClassA.

เหมือนกัเปลี่ยน FunctionA ต้องเป็นคนที่ไม่ใช่ในรูปของไฟฟ้าสถิตย์หรือทำให้พจนานุกรมสอคงทน

2021-11-22 16:28:57
1

ฉันยังไม่สามารถค่อนข้างบอกอะไรคุณกำลังพยายามจะทำ แต่ฉันจะทำดีที่สุดเพื่อให้คุณดูบางอย่างอยู่

ผมกำลังลงเรียนนี่ที่ตัดสินให้ประหารชีวิตคุณเขียน: "จุดจบโดยมีจุดประสงค์เพื่อนี่จะเปิดเผยเรื่องนี้พจนานุกรมและอนุญาตให้แตกต่างวิธีการโดยตรงอ่าน/เขียนอกจาก/เพื่อน" เป็นของฉันนำทาง

บางส่วนชั้นเรียนปัญหา

ที่ฉันพูดถึงอยู่ในความคิดเห็นที่ไหนไม่มีสิ่งที่เรียกว่าเป็นแค่ส่วนนึงของชั้นเรียน คนบางส่วนคำค้นเพียงชี้ให้เห็นว่านั่นเป็นชั้นเรียนอาจจะเป็นกำหนดไว้ในมากกว่าหนึ่งแฟ้ม ที่นิยามกฎสำหรับชั้นเรียนอยู่คนเดียวกันมันเป็นแค่บางอย่างของชั้นสมาชิกอาจจะกำหนดไว้ในแฟ้มและส่วนอื่นๆในแฟ้มอื่น.

ที่ปัญหาเรื่องคุณจะมีที่นี่มี อะไร ต้องทำยังไงกับ partial คำค้น.

คุณสองคน //มันไม่ทำงาน บันทึกย่อ

คนแรกดูเหมือนนี้:

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

ที่แรกบนเส้นประกาศให้แบงค์ที่พิมพ์คำว่าส่วนตัวสมาชิกสนาม ClassA ชื่อ instanceOfDict และ initializes มัน นั่นคือเหตุผลว่าทำไมมัน compiles.

ที่สองเส้นตามที่พยายามทำให้ runnable รหัส(เป็นเรียกฟังก์ชัน)โดยตรงในระดับบนขอบเขตของชั้นเรียน คุณไม่สามารถทำอย่างนั้น คุณสามารถทำให้กลุ่มของเรื่องที่ระดับบนสุดขอบเขตของชั้นเรียน(e.g.,ช่องข้อมูล,คุณสมบัติ,วิธีการของ,delegates,enums,ตนภายในชั้นเรียน)แต่คุณไม่สามารถให้รหัสนั้น

คุณสองปัญหาดูเหมือนนี้:

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              
    }          
}

FunctionA เป็น static วิธีการ. instanceOfDict เป็นส่วนตัวสนามของชั้นเรียนไม่ประกาศเป็นคงทน คุณไม่สามารถเรียกตัวอย่างเพื่อตัวอย่าง-ระดับสมาชิก(วิธีการของ,คุณสมบัติช่องข้อมูล,...)จากรูปแบบวิธีการ. อ่านบน static คำค้น.

สร้างชั้นเรียนนั่น Selectively เปิดโปงเป็นพจนานุกรม

ตั้งแต่คุณต้องการจะทำบางอย่างพจนานุกรมทำงานในห้องแต่เปิดเผยมันให้ออกมาข้างนอกแล้วฉันไปทั้งแย่และทำให้ชั้นเรียนของผมอยู่ทั่วไป <TKey, TValue> ดังนั้นมันทำงานกับพจนานุกรมของประเภทนี้ได้นะ

ฉันยังทำมันด้วยอะไรซักอย่าง ชุดสะสม Initialization รูปแบบ ดังนั้นคุณสามารถเริ่มการใช้งานโหของคุณเรียนก็เหมือนกับว่ามันเป็นพจนานุกรมแล้ว

ต้องใช้ชุดสะสม Initialization รูปแบบของคุณชั้นเรียนต้องทำอย่าง:

  1. ด้วยอะไรซักอย่า IEnumerable หรือ IEnumerable<T> (T จะมีประเภทไม่ใช่คนประเภทที่คุณรวบรวม-คุณสามารถพึ่งขว้าง NotImplementedException ถ้าคุณไม่สนใจ)

  2. รวมถึงวิธีการนั้นดูเหมือนว่า public void Add (SomeType atLeastOneParameter). คุณสามารถมีมากกว่าหนึ่งของโอเวอร์โหลด Add ถ้าคุณต้องการ

ดังนั้นผมเริ่มกับเรื่องนี้(โปรดสังเกตว่ามัน implements 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();
    }
}

นั่นมันมากพอที่จะทำให้เป็นห้องส่วนใหญ่ก็ดูเหมือนพจนานุกรม(ของคุณอาจจะต้องการเพิ่มซักทางเพื่อเอาข้อมูลเป็นต้น แต่นั่นขึ้นอยู่กับคุณ(คุณอาจจะอยากได้ตัวสร้างดัชนี(บ TKeyและเป็น TryGetValue.

แต่มาเพิ่มอีกหน่อแบบสุ่ม functionality ไปที่ชั้นเรียน(ให้อยู่ที่ระดับบนสุดขอบเขตของคลาส):

    public int Count => _theDictionary.Count;

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

ที่จะอนุญาตให้คุณเห็นว่าหลายสิ่งที่อยู่ในพจนานุกรมของคุณและอนุญาตให้คุณ iterate นือรายการ(คน KeyValuePairs)ว่าพจนานุกรมคลังภาพบนตำแหน่ง. รู้สึกอิสระที่จะเพิ่มมากกว่าที่มีคุณสมบัติ.

ในที่สุดจะทดสอบนี้...

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);
    }
}

ตอนที่ฉันวิ่งออดรหัสนี้,ฉันเข้าใจ:

TestDict Count: 6
one
five
eight
ten
hundredFive
threeHundred

แยกกันออนี้โดยใช้บางส่วน

ฉันไม่รู้ว่าทำไมคุณต้องการใช้ partial class. ปกติแล้วนี่คือทำให้มีสองท่อนของรหัสนั่นเป็นจ/คอยดูแลเรื่อยต่างกัน personas(รความช่วยเหลือจากเหตุผลสำหรับราสตูดิโอขอ templating/wizarding กลไกของมันจะรักษาด้านนึงของคน partial class และที่โปรแกรมเมอร์อีกคนไป

กฏมันค่อนข้างง่ายคุณเพียงประกาศ public partial class MyClass ในอีกสองแฟ้ม สองคนแฟ้มที่ต้องเป็นแบบเดียวกับโครงการ(i.e.,รวบรวมข้อมูลเสร็ไปที่เดียวกับ โรงเรี)และเรียนต้องเป็นแบบเดียวกับย้ายไปยัง. เมื่อคุณทำอย่างนั้นก็แบ่ง(ระดับบนขอบเขต)ชิ้นต่อชิ้นข้ามสองคน partial class declarations.

ในนี้คดีเป็นฉันจะแยกออกแบบนี้

  • อีกด้านนึงผมจะให้สองคนฟังก์ชันต้องการที่จะดำเนินคประกาศ IEnumerator<TValue>:
    • public IEnumerator<TValue> GetEnumerator()
    • IEnumerator IEnumerable.GetEnumerator()
  • หนึ่งยังโลกอีกด้านหนึ่งผมจะลงทุนทุกสิ่งทุกอย่างอื่น:
    • ในพจนานุกรมปล่อยให้เธอได้หายใจอยู่อีและ intialization
    • อีก 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

ฉันไม่สามารถแสดงความรู้สึกสำนึกบุญคุณผมสำหรับเรื่องนี้ มันยังช่วยฉันจะพักไม่กี่ misconceptions ฉันมี บางครั้งเรียนรู้ตั้งโปรแกรมได้แต่น่าหงุดหงิดแต่ luckly มันน่าทึ่งบุคคลเหมือนคุณนั่นคำอุทิศให้เป็นชิ้นส่วนของวันของคุณเพื่อช่วยคนอื่น ขอบคุณอีกครั้ง!
roccaforte

ใช่,ฉันทำเอง โชคดีนะที่ผมมีก็แค่ทำมันขึ้นมาได้สำเร็จขนาดนี้ตรานั้นอนุญาตให้ฉันเป็นนักศึกษาใหม่เริ่มแลกเปลี่ยนเป็นเงินตราต่างประเทศ. :-)
roccaforte

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

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

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่