상세 컨텐츠

본문 제목

[C#] map기능과 비슷한 함수 관련 (Dictionary, hashtable)

본문

반응형

 

 

 

 

=======================

=======================

=======================

 

 

 

 

 

출처: https://docs.microsoft.com/ko-kr/dotnet/api/system.collections.generic.dictionary-2?view=netframework-4.7.2

 

 

 

Dictionary<TKey,TValue> Class

정의

키와 값의 컬렉션을 나타냅니다.

C#
[System.Runtime.InteropServices.ComVisible(false)] [System.Serializable] public class Dictionary<TKey,TValue> : System.Collections.Generic.ICollection<System.Collections.Generic.KeyValuePair<TKey,TValue>>, System.Collections.Generic.IDictionary<TKey,TValue>, System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<TKey,TValue>>, System.Collections.Generic.IReadOnlyCollection<System.Collections.Generic.KeyValuePair<TKey,TValue>>, System.Collections.Generic.IReadOnlyDictionary<TKey,TValue>, System.Collections.IDictionary, System.Runtime.Serialization.IDeserializationCallback, System.Runtime.Serialization.ISerializable

형식 매개 변수

TKey

사전에 있는 키의 형식입니다.

TValue

사전에 있는 값의 형식입니다.

상속
Dictionary<TKey,TValue>
파생
특성
구현

예제

다음 코드 예제에서는 빈 Dictionary<TKey,TValue> 사용 하 여 문자열 키를 사용 하 여 문자열을 Add 일부 요소를 추가 하는 방법입니다. 예제에 합니다 Add 메서드가 throw는 ArgumentException 중복 키를 추가 하려고 할 때입니다.

예제에서는 합니다 Item[TKey] 속성 (C# 인덱서) 설명 하는 값을 검색 하는KeyNotFoundException 요청 된 키가 없는, 하 고 보여 주는 키를 사용 하 여 연결 된 값을 바꿀 수 있습니다 하는 경우에 throw 됩니다.

사용 하는 방법을 보여 주는 예제는는 TryGetValue 메서드 값을 검색 하는 프로그램 종종 사용 해야 하는 사전에 없는 키 값을 사용 하는 방법을 보여 줍니다 하는 경우는 더욱 효율적인 방법으로는 ContainsKey 메서드는 를호출하기전에키가있는지여부를테스트 Add 메서드.

이 예제에서는 키와 사전에 값을 열거 하는 방법 및 키를 열거 하는 방법을 보여 줍니다 고 단독으로 사용 하 여 값을 Keys 속성 및 Values 속성입니다.

마지막으로, 예제에 Remove 메서드.

C#
using System; using System.Collections.Generic;  public class Example {     public static void Main()     {         // Create a new dictionary of strings, with string keys.         //         Dictionary<string, string> openWith =              new Dictionary<string, string>();          // Add some elements to the dictionary. There are no          // duplicate keys, but some of the values are duplicates.         openWith.Add("txt", "notepad.exe");         openWith.Add("bmp", "paint.exe");         openWith.Add("dib", "paint.exe");         openWith.Add("rtf", "wordpad.exe");          // The Add method throws an exception if the new key is          // already in the dictionary.         try         {             openWith.Add("txt", "winword.exe");         }         catch (ArgumentException)         {             Console.WriteLine("An element with Key = \"txt\" already exists.");         }          // The Item property is another name for the indexer, so you          // can omit its name when accessing elements.          Console.WriteLine("For key = \"rtf\", value = {0}.",              openWith["rtf"]);          // The indexer can be used to change the value associated         // with a key.         openWith["rtf"] = "winword.exe";         Console.WriteLine("For key = \"rtf\", value = {0}.",              openWith["rtf"]);          // If a key does not exist, setting the indexer for that key         // adds a new key/value pair.         openWith["doc"] = "winword.exe";          // The indexer throws an exception if the requested key is         // not in the dictionary.         try         {             Console.WriteLine("For key = \"tif\", value = {0}.",                  openWith["tif"]);         }         catch (KeyNotFoundException)         {             Console.WriteLine("Key = \"tif\" is not found.");         }          // When a program often has to try keys that turn out not to         // be in the dictionary, TryGetValue can be a more efficient          // way to retrieve values.         string value = "";         if (openWith.TryGetValue("tif", out value))         {             Console.WriteLine("For key = \"tif\", value = {0}.", value);         }         else         {             Console.WriteLine("Key = \"tif\" is not found.");         }          // ContainsKey can be used to test keys before inserting          // them.         if (!openWith.ContainsKey("ht"))         {             openWith.Add("ht", "hypertrm.exe");             Console.WriteLine("Value added for key = \"ht\": {0}",                  openWith["ht"]);         }          // When you use foreach to enumerate dictionary elements,         // the elements are retrieved as KeyValuePair objects.         Console.WriteLine();         foreach( KeyValuePair<string, string> kvp in openWith )         {             Console.WriteLine("Key = {0}, Value = {1}",                  kvp.Key, kvp.Value);         }          // To get the values alone, use the Values property.         Dictionary<string, string>.ValueCollection valueColl =             openWith.Values;          // The elements of the ValueCollection are strongly typed         // with the type that was specified for dictionary values.         Console.WriteLine();         foreach( string s in valueColl )         {             Console.WriteLine("Value = {0}", s);         }          // To get the keys alone, use the Keys property.         Dictionary<string, string>.KeyCollection keyColl =             openWith.Keys;          // The elements of the KeyCollection are strongly typed         // with the type that was specified for dictionary keys.         Console.WriteLine();         foreach( string s in keyColl )         {             Console.WriteLine("Key = {0}", s);         }          // Use the Remove method to remove a key/value pair.         Console.WriteLine("\nRemove(\"doc\")");         openWith.Remove("doc");          if (!openWith.ContainsKey("doc"))         {             Console.WriteLine("Key \"doc\" is not found.");         }     } }  /* This code example produces the following output:  An element with Key = "txt" already exists. For key = "rtf", value = wordpad.exe. For key = "rtf", value = winword.exe. Key = "tif" is not found. Key = "tif" is not found. Value added for key = "ht": hypertrm.exe  Key = txt, Value = notepad.exe Key = bmp, Value = paint.exe Key = dib, Value = paint.exe Key = rtf, Value = winword.exe Key = doc, Value = winword.exe Key = ht, Value = hypertrm.exe  Value = notepad.exe Value = paint.exe Value = paint.exe Value = winword.exe Value = winword.exe Value = hypertrm.exe  Key = txt Key = bmp Key = dib Key = rtf Key = doc Key = ht  Remove("doc") Key "doc" is not found.  */ 

설명

Dictionary<TKey,TValue> 제네릭 클래스는 키 집합에서 값 집합에 대 한 매핑을 제공 합니다. 사전에 추가하는 각 항목은 값과 관련 키로 이루어져 있습니다. 해당 키를 사용 하 여 값을 검색 이므로 매우 빠르며 닫기 O(1)을를 Dictionary<TKey,TValue> 클래스는 해시 테이블로 구현 됩니다.

 참고

검색의 속도 대 한 지정 된 형식의 해시 알고리즘의 품질에 따라 달라 집니다 TKey합니다.

개체를 키로 사용으로 Dictionary<TKey,TValue>, 해당 해시 값에 영향을 주는 어떤 방식으로든 바뀌지 않아야 합니다. 모든 키를 Dictionary<TKey,TValue> 사전의 같음 비교자에 따라 고유 해야 합니다. 키 일 수 없습니다 null, 수 면 형식과 TValue 는 참조 형식입니다.

Dictionary<TKey,TValue> 키가 같은지 여부를 확인 하는 같음 구현이 필요 합니다. 구현의 지정할 수 있습니다는 IEqualityComparer<T> 허용 하는 생성자를 사용 하 여 제네릭 인터페이스를 comparer 매개 변수, 구현, 기본 제네릭 같음 비교자를 지정 하지 않으면EqualityComparer<T>.Default 사용 됩니다. 경우 형식 TKey 구현 된 System.IEquatable<T> 제네릭 인터페이스를 기본 같음 비교자를 구현 하 여 사용 합니다.

 참고

예를 들어,에서 제공 하는 대/소문자 문자열 비교자를 사용할 수 있습니다는StringComparer 클래스는 대/소문자 구분 문자열 키를 사용 하 여 사전을 만듭니다.

용량을 Dictionary<TKey,TValue> 요소입니다는 Dictionary<TKey,TValue> 보유할 수 있습니다. 요소에 추가 되는 Dictionary<TKey,TValue>, 용량을 증가 시켜 자동으로 내부 배열을 다시 할당 하 여 필요에 따라 합니다.

.NET framework에만 해당: 에 대 한 매우 큰 Dictionary<TKey,TValue> 개체를 설정 하 여 64 비트 시스템에서 2 십억 요소에 최대 용량을 늘릴 수 있습니다는 enabled 특성을<gcAllowVeryLargeObjects> 구성 요소를 true 에 런타임 환경입니다.

열거형의 목적상 사전의 각 항목 처리는 KeyValuePair<TKey,TValue> 값과 키를 나타내는 구조입니다. 항목이 반환 되는 순서 정의 되지 않습니다.

합니다 foreach C# 언어의 (for each c + +에서는 For Each Visual Basic에서) 컬렉션 요소의 형식의 개체를 반환 합니다. 하므로 Dictionary<TKey,TValue> 은 요소 형식, 키 및 값의 컬렉션 키의 형식 또는 값의 아닙니다. 요소 형식은 아니라는 KeyValuePair<TKey,TValue> 키 형식 및 값 형식입니다. 예:

C#
foreach( KeyValuePair<string, string> kvp in myDictionary ) {     Console.WriteLine("Key = {0}, Value = {1}", kvp.Key, kvp.Value); } 

foreach 문을 원하는 열거자를 컬렉션에서 읽기만 허용 하지 쓸 래퍼입니다.

 참고

키에 상속 될 수 있으므로 동작을 변경할의 절대적인 고유성을 보장할 수 없습니다를 사용 하 여 비교 하 여는 Equals 메서드.

 

 

 

 

=======================

=======================

=======================

 

 

출처: https://docs.microsoft.com/ko-kr/dotnet/api/system.collections.generic.dictionary-2.containskey?view=netframework-4.7.2

 

 

Dictionary<TKey,TValue>.ContainsKey(TKey) Method

정의

Dictionary<TKey,TValue>에 지정한 키가 포함되어 있는지 여부를 확인합니다.

C#
public bool ContainsKey (TKey key);

매개 변수

key
TKey

Dictionary<TKey,TValue>에서 찾을 수 있는 키입니다.

반환

true에 지정한 키가 있는 요소가 포함되어 있으면 Dictionary<TKey,TValue>이고, 그렇지 않으면 false입니다.

구현

예외

key가 null입니다.

예제

다음 코드 예제를 사용 하는 방법을 보여 줍니다 합니다 ContainsKey 메서드를 호출 하기 전에 키의 존재 여부를 테스트 합니다 Add 메서드. 또한 사용 하는 방법을 보여 줍니다는 TryGetValue 프로그램을 사전에 없는 키를 자주 사용 하는 경우 값을 검색 하는 효율적인 방법으로 값을 검색 방법입니다. 마지막으로 표시 테스트 하는 가장 효율적인 방법은 키가 있는지를 사용 하 여는 Item[TKey] 속성 (C# 인덱서).

이 코드 예제는에 대해 제공 된 큰 예제의 일부 합니다 Dictionary<TKey,TValue> 클래스 (openWith 이 예제에서 사용 하 여 사전의 이름).

C#
// ContainsKey can be used to test keys before inserting  // them. if (!openWith.ContainsKey("ht")) {     openWith.Add("ht", "hypertrm.exe");     Console.WriteLine("Value added for key = \"ht\": {0}",          openWith["ht"]); } 
C#
// When a program often has to try keys that turn out not to // be in the dictionary, TryGetValue can be a more efficient  // way to retrieve values. string value = ""; if (openWith.TryGetValue("tif", out value)) {     Console.WriteLine("For key = \"tif\", value = {0}.", value); } else {     Console.WriteLine("Key = \"tif\" is not found."); } 
C#
// The indexer throws an exception if the requested key is // not in the dictionary. try {     Console.WriteLine("For key = \"tif\", value = {0}.",          openWith["tif"]); } catch (KeyNotFoundException) {     Console.WriteLine("Key = \"tif\" is not found."); }

 

 

 

 

=======================

=======================

=======================

 

 

출처: https://hongjinhyeon.tistory.com/87

 

C#에서는 KEY 와 VALUE를 사용해서 자료를 저장하는 타입이 2가지가 있습니다.

해시테이블과 딕셔너리인데 사용법은 거의 동일하지만 내부적으로 처리하는 기술이 다릅니다.

이 두가지 타입의 기본적인 사용법과 장단점에 대해서 알아보겠습니다.

 

1.해시테이블 ( Hashtable)

 

01.//생성
02.Hashtable hashtable = new Hashtable();
03. 
04.//자료 추가 ( 박싱이 일어남)
05.hashtable.Add("Data1"new HongsClass() { Name = "홍진현1", intCount = 1 });
06.hashtable.Add("Data2"new HongsClass() { Name = "홍진현2", intCount = 2 });
07. 
08.//자료 검색
09.if (hashtable.ContainsKey("Data1").Equals(true))
10.{
11.HongsClass temp = hashtable["Data1"as HongsClass; (언박싱 처리)
12.Console.WriteLine(temp.Name);
13.}
14. 
15.//Loop 전체 순회출력
16.foreach (string NowKey in hashtable.Keys)
17.{
18.HongsClass temp = hashtable[NowKey] as HongsClass;
19.Console.WriteLine(temp.Name);
20. 
21.}
22. 
23.//결과  OUTPUT
24.//홍진현1
25.//홍진현1
26.//홍진현2
27. 
28.<p></p>

 

 

반응형

 

728x90

 

 

 

 

[해시테이블의 특징]

 

1.Non-Generic

2.Key 와 Value 모두 Object를 입력받는다.

3.박싱/언박싱(Boxing/Un-Boxing) (참고: http://hongjinhyeon.tistory.com/90을 사용한다. 

 

 

즉, 제네릭을 이용하지 않고 Object를 사용하기 때문에 모든 데이터 타입을 다 받고 처리 할 수 있는 장점이 있지만

자료의 입력에 내부적으로 박싱이 일어나고 사용하는 곳에서도 다시 언박싱을 해줘야 사용이 가능합니다.

 

 

2.딕셔너리 ( Dictionary )

 

01.//생성- 제네릭 기반
02.Dictionary<string, HongsClass> dictionary = new Dictionary<string, HongsClass>();
03. 
04.//자료추가
05.dictionary.Add("Data1"new HongsClass() { Name = "홍진현1", intCount = 1 });
06.dictionary.Add("Data2"new HongsClass() { Name = "홍진현2", intCount = 2 });
07. 
08.//자료검색
09.if (dictionary.ContainsKey("Data1").Equals(true))
10.{
11.Console.WriteLine(dictionary["Data1"].Name);
12.}
13. 
14.//Loop 전체 순회출력
15.foreach (HongsClass NowData in dictionary.Values)
16.{
17.Console.WriteLine(NowData.Name);
18.}
19. 
20.//결과
21.//홍진현1
22.//홍진현1
23.//홍진현2
 

[딕셔너리의 특징]


1.Generic
2.Key와 Value 모두 Strong Type을 입력받는다.(선언시 타입을 입력해줘야함)

3.박싱/언박싱이 일어나지 않는다.

 

 

+딕셔너리는 선언시에 사용할 타입을 미리 설정하기 때문에 입력시나 출력시에도 박싱/언박싱이 일어나지 않습니다.

따라서 입력과 사용에 용이하며, 외부에서도 이 타입을 사용할 때도 타입이 정의되어 있으니 다른 타입으로 형변환을

시도하다가 실패할 염려가 없습니다.

 

 

3.결론

 

+두가지 타입이 사용법은 비슷하지만 내부적인 처리와 수용하는 타입의 형태가 다르므로 필요에 따라서 선택을 해야합니다.

고정적으로 하나의 타입만 입력받을 시에는 딕셔너리를 사용하며, Value에 일정한 형식이 없고 여러 형태를 저장하려면

해시테이블을 사용해야합니다.



출처: https://hongjinhyeon.tistory.com/87 [생각대로 살지 않으면 사는대로 생각한다.]

 

 

 

 

=======================

=======================

=======================

 

 

 

출처: http://www.csharpstudy.com/DS/hash.aspx

 

자료구조 : 해시테이블 (Hash Table) 

해시(Hash)는 키 값을 해시 함수(Hash function)으로 해싱하여 해시테이블의 특정 위치로 직접 엑세스하도록 만든 방식이다.
키 값을 통해 직접 엑세스하기 위해서 모든 가능한 키 값을 갖는 배열을 만들면, 배열크기가 엄청나게 커지게 된다. 예를 들어, 주민등록번호를 키 값으로 하는 경우, 000000-0000000 부터 999999-9999999까지 10의 13승의 배열 공간이 필요한데, 만약 회원수가 1000명인 경우, 1000명을 저장하기 위해 10^13의 엄청난 배열 공간이 필요하게 된다. 이렇게 낭비되는 공간을 줄이기 위해 해시 함수를 사용하게 되는데, 이 함수는 적은 공간 안에서 모든 키를 직접 찾아갈 수 있도록 해준다.

하지만 경우에 따라 서로 다른 키가 동일한 해시테이블 버켓 위치를 가리킬 수 있는데, 이를 해결하기 위해 여러 Collision Resolution 방식이 사용된다. Collision Resolution의 방식으로 Chaining을 비롯하여 Linear Probing, Quadratic Probing, Double Hashing 등 여러가지가 있다. 해시테이블 자료구조는 추가, 삭제, 검색에서 O(1)의 시간이 소요된다. 



Hashtable 클래스 

.NET에 해시테이블을 구현한 Non-generic 클래스로 Hashtable 클래스가 있다. Hashtable은 Key값과 Value값 모두 object 타입을 받아들이며, 박싱/언박싱을 하게 된다. Hashtable은 Double Hashing 방식을 사용하여 Collision Resolution을 하게 된다. 즉, 해시함수를 사용하여 Key가 충돌(Collision)이 발생하면, 다른 해시함수를 계속 사용하여 빈 버켓을 찾게된다. 이 자료구조는 추가, 삭제, 검색에서 O(1)의 시간이 소요된다. 

예제

Hashtable ht = new Hashtable(); ht.Add("irina", "Irina SP"); ht.Add("tom", "Tom Cr");  if (ht.Contains("tom")) {     Console.WriteLine(ht["tom"]); } 

 

 

Dictionary<Tkey,TValue> 클래스 

.NET에 Generic방식으로 해시테이블을 구현한 클래스로 Dictionary<Tkey,TValue> 클래스가 있다. Dictionary는 Key값과 Value값 모두 Strong type을 받아들이며, 박싱/언박싱을 일으키지 않는다. Dictionary는 Chaining 방식을 사용하여 Collision Resolution을 하게 된다. 이 자료구조는 추가, 삭제, 검색에서 O(1)의 시간이 소요된다. 

예제

Dictionary<int, string> emp = new Dictionary<int, string>(); emp.Add(1001, "Jane"); emp.Add(1002, "Tom"); emp.Add(1003, "Cindy");  string name = emp[1002]; Console.WriteLine(name); 

ConcurrentDictionary<Tkey,TValue> 클래스 

.NET 4.0 부터 멀티쓰레딩 환경에서 Dictionary를 보다 간편하게 사용할 수 있는 새로운 클래스인 ConcurrentDictionary<Tkey,TValue> 가 제공되었다. ConcurrentDictionary 클래스에서는 기본적으로 데이타를 추가하기 위해 TryAdd() 메서드를 사용하고, 키값을 읽기 위해서는 TryGetValue() 메서드를 사용한다. 또한 기존 키값을 갱신하기 위해서 TryUpdate() 메서드를, 기존 키를 지우기 위해서는 TryRemove() 메서드를 사용한다.

아래 예제는 하나의 쓰레드가 ConcurrentDictionary 에 Key를 1부터 100까지 계속 집어 넣을 때, 동시에 다른 쓰레드에서는 계속 그 해시테이블에서 Key가 1부터 100까지인 데이타를 빼내 (순차적으로) 읽어 오는 작업을 하는 샘플 코드이다. 


예제

using System; using System.Collections; using System.Collections.Concurrent; // ConcurrentDictionary using System.Threading; using System.Threading.Tasks;  namespace ConcurrentApp {     class Program     {         static void Main(string[] args)         {             var dict = new ConcurrentDictionary<int, string>();              Task t1 = Task.Factory.StartNew(() =>             {                 int key = 1;                                 while (key <= 100)                 {                     if (dict.TryAdd(key, "D" + key))                     {                         key++;                     }                     Thread.Sleep(100);                 }             });              Task t2 = Task.Factory.StartNew(() =>             {                 int key = 1;                 string val;                 while (key <= 100)                 {                     if (dict.TryGetValue(key, out val))                     {                         Console.WriteLine("{0},{1}", key, val);                         key++;                     }                     Thread.Sleep(100);                 }             });              Task.WaitAll(t1, t2);         }     } }  

C#으로 간단한 해시테이블 구현 

해시테이블은 기본적으로 배열을 저장 장소로 사용한다. 아래의 간단한 해시테이블 구현에서도 buckets라는 배열을 기본 데이타 멤버로 사용하고 있다. 해시함수를 사용하여 정해진 배열내에서 특정 배열요소 위치를 계산하게 되며, 만약 키 중복이 발생하는 경우 Chaining방식을 사용하여 링크드 리스트로 연결하여 저장하게 된다. 이 예제는 기본 개념을 예시하기 위한 것으로 많은 기능들이 생략되어 있다. 

예제

namespace MyHash {     public class SimpleHashTable     {         private const int INITIAL_SIZE = 16;         private int size;         private Node[] buckets;          public SimpleHashTable()         {             this.size = INITIAL_SIZE;             this.buckets = new Node[size];         }          public SimpleHashTable(int capacity)         {             this.size = capacity;             this.buckets = new Node[size];         }          public void Put(object key, object value)         {             int index = HashFunction(key);             if (buckets[index] == null)             {                 buckets[index] = new Node(key, value);             }             else             {                 Node newNode = new Node(key, value);                 newNode.Next = buckets[index];                 buckets[index] = newNode;             }         }          public object Get(object key)         {             int index = HashFunction(key);                          if (buckets[index] != null)             {                 for (Node n = buckets[index]; n != null; n = n.Next)                 {                     if (n.Key == key)                     {                         return n.Value;                     }                 }             }             return null;         }          public bool Contains(object key)         {             int index = HashFunction(key);             if (buckets[index] != null)             {                 for (Node n = buckets[index]; n != null; n = n.Next)                 {                     if (n.Key == key)                     {                         return true;                     }                 }             }             return false;         }          protected virtual int HashFunction(object key)         {             return Math.Abs(key.GetHashCode() + 1 +                  (((key.GetHashCode() >> 5) + 1) % (size))) % size;                     }          private class Node         {             public object Key { get; set; }             public object Value { get; set; }             public Node Next { get; set; }              public Node(object key, object value)             {                 this.Key = key;                 this.Value = value;                 this.Next = null;             }         }     }      class Program     {         static void Main(string[] args)         {             // Chaining 테스트를 위해              // capacity를 1로 셋팅할 수 있음                         //SimpleHashTable ht = new SimpleHashTable(1);              SimpleHashTable ht = new SimpleHashTable();             ht.Put("Kim D", "Sales 01");             ht.Put("Lee K", "Sales 02");             ht.Put("Park S", "IT 03");             ht.Put("Shin O", "IT 04");              Console.WriteLine(ht.Get("Lee K"));             Console.WriteLine(ht.Get("Shin O"));             Console.WriteLine(ht.Contains("Unknown"));         }     } } 

 

 

 

=======================

=======================

=======================

 

 

 

출처 https://snowting-mj.tistory.com/28

 

 

Dictionary<> foreach 루프

 

C++에서는 map

C#에서는 Dicrionary로 사용되는 컨테이너.

 

foreach문의 개념만 알고 있다면 Dictionary를 돌리면서 key 와 value를 얻어오는 과정은 어렵지 않다.

가장 기본적인 내용부터 보자면 

 

Dictionary<> 컨테이너의 foreach 변수(?)는 KeyValuePair다.

 

foreach(KeyValuePair<string, bool> items in Dic)

{

    Console.WriteLine("{0} ,  {1}", items.Key, items.Value);

}

 

근데 여기서 주의해야 할 점은, 

foreach문 안에서 원본 Dictionart<>에 해당하는 Dic의 Key와 Value값을 수정하려고 하면 에러가 난다.

 

즉, 억지로 편집하려고 하면 안된다.

 

예를 들어서, 이런식으로.

 

 

foreach(KeyValuePair<string, bool> items in Dic)

{

    Dic[items.Key] = true;

}

 

foreach는 Dictionary<> 컨테이너로부터 값을 얻어오는 역할이지, 

에디터 역할은 아니다.

 

Dictionary<> 값을 바꾸고 싶다면 for문이 적합하다.

 

 

for문으로 Dictionary<> 돌리기.

 

for(int i =0; i< Dic.Count; i++)

{

    if(Dic.Keys.ToList()[i] == name)

    {

        Dic[name] = bCheck;

    }

    else if(Dic.Values.ToList()[i] == true)

    {

        Dic[name] = bCheck;

    }

}

 

for문으로 루프를 돌려주면서 조건문 안에서는 Keys와 Values들의 List를 불러와 해당 컨테이너의 원하는 값을 가져온다.

foreach와 같은 역할이다.

for문 안에서는 Dictionary<> 컨테이너의 수정이 가능하니 참고하길 바란다.

 



출처: https://snowting-mj.tistory.com/28 [I Know]

 

 

 

 

 

=======================

=======================

=======================

 

 

 

출처: https://stackoverflow.com/questions/141088/what-is-the-best-way-to-iterate-over-a-dictionary

 

In some cases you may need a counter that may be provided by for-loop implementation. For that, LINQ provides ElementAt which enables the following:

 

for (int index = 0; index < dictionary.Count; index++) {   var item = dictionary.ElementAt(index);   var itemKey = item.Key;   var itemValue = item.Value; }

 

 

 

 

=======================

=======================

=======================

 

 

 

 

반응형


관련글 더보기

댓글 영역