Development Tip

NameValueCollection을 통해 C # 반복

yourdevel 2020. 10. 28. 21:11
반응형

NameValueCollection을 통해 C # 반복


나는이 NameValueCollection, 그 값을 반복하고 싶습니다. 현재이 작업을하고 있지만 더 깔끔한 방법이있을 것 같습니다.

NameValueCollection nvc = new NameValueCollection();
nvc.Add("Test", "Val1");
nvc.Add("Test2", "Val1");
nvc.Add("Test2", "Val1");
nvc.Add("Test2", "Val2");
nvc.Add("Test3", "Val1");
nvc.Add("Test4", "Val4");

foreach (string s in nvc)
    foreach (string v in nvc.GetValues(s))
        Console.WriteLine("{0} {1}", s, v);

Console.ReadLine();

거기 있어요?


Linq를 사용하여 컬렉션을 평면화 할 수 있지만 여전히 foreach루프이지만 이제는 더 암시 적입니다.

var items = nvc.AllKeys.SelectMany(nvc.GetValues, (k, v) => new {key = k, value = v});
foreach (var item in items)
    Console.WriteLine("{0} {1}", item.key, item.value);

첫 번째 줄은 중첩 된 컬렉션을 keyvalue 속성이있는 익명 개체의 (중첩되지 않은) 컬렉션으로 변환합니다 .

이제 키-> 값 모음 대신 매핑 키-> 값인 방식으로 평평 해졌습니다 . 예제 데이터 :

전에:

테스트-> [Val],

테스트 2-> [Val1, Val1, Val2],

테스트 3-> [Val1],

테스트 4-> [Val4]

후:

테스트-> Val,

Test2-> Val1,

Test2-> Val1,

Test2-> Val2,

Test3-> Val1,

테스트 4-> Val4


두 개의 루프 대신 조회에 키를 사용할 수 있습니다.

foreach (string key in nvc)
{
    Console.WriteLine("{0} {1}", key, nvc[key]);
}

여기에서 볼 새로운 것은 없습니다 (@Julian의 + 1'd by me 대답은 기능적으로 동일합니다). 모두 함께 이동하십시오.


관련 질문에 대한 답변에 [이 경우 과도하지만 관련성이있을 수있는] 확장 메서드 집합이 있습니다. 이렇게하면 다음 작업을 수행 할 수 있습니다.

foreach ( KeyValuePair<string,string> item in nvc.AsEnumerable().AsKeyValuePairs() )
    Console.WriteLine("{0} {1}", item.key, item.value);

중첩 루프를 피하는 유일한 방법은 추가 List를 사용하여 값을 저장하는 것입니다.

List<string> arrValues = new List<string>();
for (int i = 0; i < nvc.Count; i++)
    arrValues.AddRange(nvc.GetValues(i));
foreach (string value in arrValues)
    Console.WriteLine(value);

([전용] .NET 2.0 이상 필요)


나는 이것이 더 간단하다고 생각합니다.

For i As Integer = 0 To nvc.Count - 1
   Console.Write("No", "Key", "Value")
   Console.Write(i, nvc.GetKey(i), nvc.Get(i))
Next

var enu = myNameValueCollection.GetEnumerator();
while (enu.MoveNext())
{
    string key = (string)enu.Current;
    string value = myNameValueCollection[key];
}

또는 키가 nullable 인 경우 :

for (int i = 0; i < myNameValueCollection.Count; i++)
{
    string key = myNameValueCollection.GetKey(i);
    string value = myNameValueCollection.Get(i);
}

foreach ( string key in nvc.Keys )
   Console.WriteLine("{0} {1}", key, nvc[key]);

그러면 모든 키와 해당 값이 반환됩니다.

참고 URL : https://stackoverflow.com/questions/5065928/c-sharp-iterate-through-namevaluecollection

반응형