2

私は辞書を持っています:

   Dictionary<ICD_Map2, string> maps = new Dictionary<ICD_Map2, string>();

    public class ICD_Map2
    {
        public string call_type {get; set; }
        public string destination{get; set;} 

    }

maps.Add(new ICD_Map2() {call_type = "Mobile SMS", destination = "Australia"},"Local Text");
maps.Add(new ICD_Map2() {call_type = "Mobile SMS", destination = "International"},"International Text");

したがって、2つの変数を渡すと、次のようになります。

ケース1variable1= "Mobile SMS" && variable2="Australia"関数が"ローカルテキスト"を返すようにしたい

ケース2「InternationalText」は、ICD_Map2定義「MobileSMS」および「International」に一致する入力変数に依存します。`

結果のセットからセットの最初を返すようにこのマッピング関数を作成するにはどうすればよいですか(複数ある場合)?これは非常に単純化された例です。100を超えるマッピングがあります。

4

5 に答える 5

3

これを実現する方法はたくさんありますが、私が実際に使用する最も速くて簡単な方法は、次のFirstOrDefaultようなLINQです。

string var1 = "Mobile SMS";
string var2 = "Australia";

var item = maps.FirstOrDefault(e => e.Key.call_type == var1 && e.Key.destination == var2);
string result = (item == null) ? "No value" : item.Value;

この場合、対応する一致がない場合は、resultnullになります。

于 2012-10-29T08:26:12.860 に答える
3

辞書を使用するには、キーが等価演算をサポートしている必要があります。例えば:

public class ICD_Map2 : IEquatable<ICD_Map2>
{
    public ICD_Map2(string callType, string destination) {
        CallType = callType;
        Destination = destination;
    }
    public override int GetHashCode() {
        int result = 17;
        result = -13 * result +
            (CallType == null ? 0 : CallType.GetHashCode());
        result = -13 * result +
            (Destination == null ? 0 : Destination.GetHashCode());
        return result;
    }
    public override bool Equals(object other) {
        return Equals(other as ICD_Map2);
    }
    public bool Equals(ICD_Map2 other) {
        if(other == null) return false;
        if(other == this) return true;
        return CallType == other.CallType && Destination == other.Destination;
    }
    public string CallType {get; private set; }
    public string Destination{get; private set;} 
}

読み取り専用にすることは意図的なものであることに注意してください。可変キーは大きな問題を引き起こす可能性があります。それは避けてください。

これで、これをキーとして使用できます。次に例を示します。

var key = new ICD_Map2("Mobile SMS", "Australia");
string result;
if(maps.TryGetValue(key, out result)) {
    Console.WriteLine("found: " + result);
}

逆引き参照には問題があり、2番目の辞書がないと最適化できません。簡単な操作(パフォーマンスO(n))は次のようになります。

string result = "International Text";
var key = (from pair in maps
           where pair.Value == result
           select pair.Key).FirstOrDefault();
if(key != null) {
    Console.WriteLine("found: " + key);
}

すべてを一緒に入れて:

static void Main()
{
    Dictionary<ICD_Map2, string> maps = new Dictionary<ICD_Map2, string> {
        {new ICD_Map2 ("Mobile SMS", "Australia"),"Local Text"},
        {new ICD_Map2 ("Mobile SMS", "International"),"International Text"}
    };

    // try forwards lookup
    var key = new ICD_Map2("Mobile SMS", "Australia");
    string result;
    if (maps.TryGetValue(key, out result))
    {
        Console.WriteLine("found: " + result);
    }

    // try reverse lookup (less efficient)
    result = "International Text";
    key = (from pair in maps
               where pair.Value == result
               select pair.Key).FirstOrDefault();
    if (key != null)
    {
        Console.WriteLine("found: " + key);
    }
}
于 2012-10-29T08:27:43.167 に答える
2

カスタム比較ツールを作成します。

public class CusComparer: IEqualityComparer<ICD_Map2>
{
    public bool Equals(ICD_Map2 x, ICD_Map2 y)
    {
        return x.call_type.Equals(y.call_type) 
              && x.destination.Equals(y.destination);
    }

    public int GetHashCode(ICD_Map2 obj)
    {
        return obj.call_type.GetHashCode() 
                 ^ obj.destination.GetHashCode();
    }
}

Dictionaryを受け入れる別のオーバーロードコンストラクタがあることを忘れないでくださいIEqualityComparer

var maps = new Dictionary<ICD_Map2, string>(new CusComparer());

maps.Add(new ICD_Map2() {
              call_type = "Mobile SMS", 
              destination = "Australia"},
         "Local Text");

maps.Add(new ICD_Map2() {
            call_type = "Mobile SMS", 
            destination = "International"},
         "International Text");

だからあなたは得ることができます:

 var local = maps[new ICD_Map2() {
                     call_type = "Mobile SMS", 
                     destination = "Australia"}];
于 2012-10-29T08:27:59.483 に答える
0

私はこれがうまくいくはずだと思います、すぐに再確認します:

maps.Where(a => (String.IsNullOrEmpty(var1) || String.Compare(a.Key.call_type, var1) == 0) 
             && (String.IsNullOrEmpty(var2) || String.Compare(a.Key.destination, var2) == 0))
    .FirstOrDefault().Value`
于 2012-10-29T08:22:58.710 に答える
0

ICD_Map2にIEquitableインターフェイスを実装し、GetHashCode関数をオーバーライドする必要があります(Dictionaryは汎用IEquitableインターフェイスを使用してキーを見つけるため、Equals(object)もオーバーライドする必要はありません)

于 2012-10-29T08:24:40.463 に答える