0

簡単な質問があります。C# で辞書を作成しているときに、辞書の半分に疑問符が含まれています。これが私の状況です:ここに画像の説明を入力

ソースコード:

/// <summary>
/// Get Member
/// </summary>
/// <param name="Binder"></param>
/// <param name="Result"></param>
/// <returns></returns>
public override bool TryGetMember(GetMemberBinder Binder, out object Result)
{
    if (Binder.Name == "AsDictionary")
    {
        IDictionary<string, string> cValues = new Dictionary<string, string>();

        foreach (var cValue in myValues)
        {
            string cVal = "";
            if (cValue.Value == null)
            {
                cVal = "";
            }
            else
            {
                cVal = cValue.Value.ToString();
            }

            cValues.Add(cValue.Key, cVal);
        }

        Result = cValues;
        return true;
    }

    int cCount = myValues.Where(Item => Item.Key.ToLower() == Binder.Name.ToLower()).ToList().Count;

    if (cCount == 0)
    {
        Result = null;
        return false;
    }
    else
    {
        Result = myValues.Where(Item => Item.Key.ToLower() == Binder.Name.ToLower()).First().Value;
    }

    return true;
}

myValues も ObservableCollection です。

private ObservableCollection<DynamicSqlValue> myValues;

DynamicSqlValue は非常に単純なクラスです。

public class DynamicSqlValue
{
    public string Key
    {
        get;
        set;
    }

    public object Value
    {
        get;
        set;
    }
}

ご協力ありがとうございました!

4

2 に答える 2

1

ある種のビジュアル スタジオの問題であるか、メモリが不足している可能性があります。値をログに記録してみましたか?

私なら Patryk よりも一歩進んで、なぜ myValues.ToDictionary を実行しないのかを尋ねます。また、.Where、.ToList、および .Count は次のように単純にする必要があります。

 myValues.Any(kvp => kvp.Key.Equals(Binder.Name, StringComparison.InvariantCultureIgnoreCase))

その関数は、実際には 4 ~ 5 行のコードにすぎないはずです。

于 2013-11-09T23:41:17.117 に答える
0

あなたの質問に対する答えではありません(申し訳ありません)が、あなたのコードのリファクタリングのヒントがあります:

foreach を次のようにします。

foreach (var cValue in myValues)
{
    cValues.Add(cValue.Key, cValue.Value != null ? cValue.Value.ToString() : string.Empty);
}

そして、linq クエリからローカル変数を作成します。

var binderMyValues = myValues.Where(Item => Item.Key.ToLower() == Binder.Name.ToLower());

例えばのようにそれを使用するには

int cCount = binderMyValues.ToList().Count;

また...

Result = binderMyValues.First().Value;
于 2013-11-09T16:22:25.233 に答える