1

Linqアイテムのリスト内からアイテムのリストを取得して辞書に変換するステートメントに苦労しています。

「コントロール」のリストを持つ「Windows」のリストがありますが、1つのコントロールタイプにもコントロールのリストがあり、それを理解できないようです(そして、Linqを理解したと思ったとき:))

現在動作中のネストされた foreach ループ

    public static Dictionary<int, Dictionary<int, bool>> _windowControlVisibilityMap = new Dictionary<int, Dictionary<int, bool>>();

    public static void RegisterControlVisibility(IEnumerable<GUIWindow> windows)
    {
        _windowControlVisibilityMap.Clear();
        foreach (var window in windows)
        {
            var controlMap = new Dictionary<int, bool>();
            foreach (var control in window.Controls)
            {
                if (control is GUIGroup)
                {
                    foreach (var grpControl in (control as GUIGroup).Controls)
                    {
                        controlMap.Add(grpControl.ControlId, grpControl.IsWindowOpenVisible);
                    }
                }
                controlMap.Add(control.ControlId, control.IsWindowOpenVisible);
            }

            _windowControlVisibilityMap.Add(window.WindowId, controlMap);
        }
    }

同じことをするためのLinqクエリでのばかげた試み。(これは機能しません)

    public static Dictionary<int, Dictionary<int, bool>> _windowControlVisibilityMap = new Dictionary<int, Dictionary<int, bool>>();

    public static void RegisterControlVisibility2(IEnumerable<GUIWindow> windows)
    {
        _windowControlVisibilityMap.Clear();
        foreach (var window in windows)
        {
            var dictionary = window.Controls.Select(k => new KeyValuePair<int, bool>(k.ControlId, k.IsWindowOpenVisible))
                .Concat(window.Controls.OfType<GUIGroup>().SelectMany(grp => grp.Controls)
                .Select(k => new KeyValuePair<int, bool>(k.ControlId, k.IsWindowOpenVisible)));

           // _windowControlVisibilityMap.Add(window.WindowId, dictionary);
        }
    }

このLinqステートメントを機能させるために誰かが私を正しい方向に向けることができれば、それは素晴らしいでしょう:)

ここにあなたが私を助けるのに役立ついくつかのモックオブジェクトがあります.LOL

public class GUIWindow
{
    public int WindowId { get; set; }
    public List<GUIControl> Controls { get; set; }
}

public class GUIControl
{
    public int ControlId { get; set; }
    public bool IsWindowOpenVisible { get; set; }
}

public class GUIGroup : GUIControl
{
    public List<GUIControl> Controls { get; set; }
}

ありがとう

4

1 に答える 1

4

以下が機能するはずです。

window.Controls.Select(x => new { x.ControlId, x.IsWindowOpenVisible })
      .Concat(window.Controls
                    .OfType<GUIGroup>()
                    .SelectMany(x => x.Controls)
                    .Select(x => new { x.ControlId, x.IsWindowOpenVisible }))
      .ToDictionary(x => x.ControlId, x => x.IsWindowOpenVisible);

しかし、ハムレットには有効なポイントがあります。 a 内の各コントロールは、別の にするGUIGroupことができますGUIGroup。これを解決するには再帰が必要です:

Func<IEnumerable<GUIControl>, IEnumerable<Tuple<int, bool>> getValues = null;
getValues = x => x.Select(x => Tuple.Create(x.ControlId, x.IsWindowOpenVisible))
                  .Concat(getValues(window.Controls
                                          .OfType<GUIGroup>()
                                          .SelectMany(x => x.Controls)));

getValues(window.Controls).ToDictionary(x => x.Item1, x => x.Item2);
于 2013-01-11T09:48:04.513 に答える