ネタ元 → グローバル変数を使いたくない
「オリンピックの参加国がそれぞれどの競技に選手を派遣しているか」
のデータから
「オリンピックの各競技はそれぞれどの国からの選手で競われるか」
を割り出すようなものです。
スピードを気にしなくていいならそんなにメンドくもなさげー
using System;
using System.Collections.Generic;
namespace Wankuma.Episteme {
public class ListOfPair<TKey,TValue> : IList<KeyValuePair<TKey,TValue>> {
private List<KeyValuePair<TKey,TValue>> list_ = new List<KeyValuePair<TKey,TValue>>();
public bool Add(TKey key, TValue val) {
KeyValuePair<TKey,TValue> item = new KeyValuePair<TKey,TValue>(key,val);
if ( list_.Contains(item) ) {
return false;
}
list_.Add(item);
return true;
}
public bool Remove(TKey key, TValue val) {
return list_.Remove(new KeyValuePair<TKey,TValue>(key,val));
}
public bool ContainsKey(TKey key) {
foreach ( KeyValuePair<TKey,TValue> pair in list_ ) {
if ( pair.Key.Equals(key ) ) return true;
}
return false;
}
public bool ContainsValue(TValue val) {
foreach (KeyValuePair<TKey, TValue> pair in list_ ) {
if (pair.Value.Equals(val)) return true;
}
return false;
}
public IEnumerable<TKey> KeysOf(TValue val) {
List<TKey> result = new List<TKey>();
foreach (KeyValuePair<TKey, TValue> pair in list_ ) {
if (pair.Value.Equals(val) && !result.Contains(pair.Key) ) {
result.Add(pair.Key);
}
}
return result;
}
public IEnumerable<TKey> Keys() {
List<TKey> result = new List<TKey>();
foreach (KeyValuePair<TKey, TValue> pair in list_) {
if ( !result.Contains(pair.Key) ) {
result.Add(pair.Key);
}
}
return result;
}
public IEnumerable<TValue> ValuesOf(TKey key) {
List<TValue> result = new List<TValue>();
foreach (KeyValuePair<TKey, TValue> pair in list_) {
if (pair.Key.Equals(key) && result.Contains(pair.Value) ) {
result.Add(pair.Value);
}
}
result.Sort();
return result;
}
public IEnumerable<TValue> Values() {
List<TValue> result = new List<TValue>();
foreach (KeyValuePair<TKey, TValue> pair in list_) {
if ( !result.Contains(pair.Value) ) {
result.Add(pair.Value);
}
}
result.Sort();
return result;
}
#region IList<KeyValuePair<TKey,TValue>> メンバ
public int IndexOf(KeyValuePair<TKey, TValue> item)
{ return list_.IndexOf(item); }
public void Insert(int index, KeyValuePair<TKey, TValue> item)
{ list_.Insert(index, item); }
public void RemoveAt(int index)
{ list_.RemoveAt(index); }
public KeyValuePair<TKey, TValue> this[int index]
{ get { return list_[index]; } set { list_[index] = value; } }
#endregion
#region ICollection<KeyValuePair<TKey,TValue>> メンバ
public void Add(KeyValuePair<TKey, TValue> item)
{ list_.Add(item); }
public void Clear()
{ list_.Clear(); }
public bool Contains(KeyValuePair<TKey, TValue> item)
{ return list_.Contains(item); }
public void CopyTo(KeyValuePair<TKey, TValue>[] array, int arrayIndex)
{ list_.CopyTo(array, arrayIndex); }
public int Count
{ get { return list_.Count; } }
public bool IsReadOnly
{ get { return false; } }
public bool Remove(KeyValuePair<TKey, TValue> item)
{ return list_.Remove(item); }
#endregion
#region IEnumerable<KeyValuePair<TKey,TValue>> メンバ
public IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator()
{ return list_.GetEnumerator(); }
#endregion
#region IEnumerable メンバ
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{ return list_.GetEnumerator(); }
#endregion
}
public class Program {
public static void Main() {
ListOfPair<string,string> olympic = new ListOfPair<string,string>();
olympic.Add("US", "マラソン");
olympic.Add("JP", "マラソン");
olympic.Add("UK", "マラソン");
olympic.Add("CH", "マラソン");
olympic.Add("US", "100m");
olympic.Add("JP", "100m");
olympic.Add("UK", "100m");
olympic.Add("JP", "400m");
olympic.Add("US", "400m");
olympic.Add("US", "砲丸投げ");
Console.Write("\n参加国: ");
foreach ( string item in olympic.Keys() ) Console.Write(" {0}", item);
Console.Write("\n競技種目: ");
foreach (string item in olympic.Values()) Console.Write(" {0}", item);
Console.WriteLine("\n\n競技種目毎の参加国");
foreach (string game in olympic.Values()) {
Console.Write("{0} : ", game);
foreach ( string country in olympic.KeysOf(game) ) {
Console.Write(" {0}", country);
}
Console.WriteLine();
}
}
}
}