Могу ли я ссылаться на этот код foreach / if / foreach / if /? - PullRequest
3 голосов
/ 21 октября 2011

Код, я думаю, может быть Linq:

    foreach (var key in _dic.Keys) // for each observed key
        if (_changedKeys.Contains(key)) // if it changed
            foreach (var item in _dic[key]) // then for each observer
                if (_webSitePage.Session[key] != null) // , as long as the value is something
                    item(_webSitePage.Session[key]); // call the registered delegate

В контексте окружающего кода:

public class WebSiteContext
{
    private WebSitePage _webSitePage;

    internal void SetSessionValue<T>(string key, T value)
    {
        object current = _webSitePage.Session[key];
        if (current != null && current.Equals(value)) return;
        _webSitePage.Session[key] = value;
        _changedKeys.Add(key);
    }

    Dictionary<string, List<Action<object>>> _dic = new Dictionary<string, List<Action<object>>>();

    List<string> _changedKeys = new List<string>();

    internal void WhenSessionValueChanges(string key, Action<object> action)
    {
        if (!_dic.ContainsKey(key)) _dic[key] = new List<Action<object>>(); // create on demand
        _dic[key].Add(action);
    }

    internal void PageLoadComplete()
    {
        foreach (var key in _dic.Keys) // for each observed key
            if (_changedKeys.Contains(key)) // if it changed
                foreach (var item in _dic[key]) // then for each observer
                    if (_webSitePage.Session[key] != null) // , as long as the value is something
                        item(_webSitePage.Session[key]); // call the registered delegate

    }
}

public class WebSitePage : System.Web.UI.Page
{
    public WebSitePage()
    {
        this.WebSiteContext = new WebSiteContext(this);
    }

    public WebSiteContext WebSiteContext { get; set; }

    protected override void OnLoadComplete(EventArgs e)
    {
        base.OnLoadComplete(e);
        this.WebSiteContext.PageLoadComplete();
    }
}

Ответы [ 4 ]

3 голосов
/ 21 октября 2011
var keys = from key in _dic.Keys
           where _changedKeys.Contains(key) && _webSitePage.Session[key] != null
           from item in _dic[key]
           select item;

foreach (var key in keys)
    item(_webSitePage.Session[key]);

EDIT:

Вышесказанное ужасно неправильно. Извиняюсь. Я намеревался использовать понимание запросов, чтобы ответить на вопрос. Вот попытка:

var tuples = from key in _dic.Keys
       where _changedKeys.Contains(key) && _webSitePage.Session[key] != null
       from item in _dic[key]
       select new { key, item };

foreach (var t in tuples)
    t.item(_webSitePage.Session[t.key]);
3 голосов
/ 21 октября 2011

Это может быть может быть изменено на LINQ, но поскольку вы вызываете item(...) для получения побочных эффектов, я думаю, что использование LINQ здесь неуместно, а цикл foreach лучше.

Вы можете написать что-то вроде этого:

 foreach (var key in _dic.Keys.Where(key => _changedKeys.Contains(key))
 {
     foreach (var item in _dic[key])
     {
         var value = _webSitePage.Session[key];
         if (value != null)
         {
             item(value);
         }
     }
 }
2 голосов
/ 21 октября 2011

Это немного укорачивает. Обратите внимание, что я переместил проверку _webSitePage, потому что она не зависит от значения item:

foreach (var kvp in _dic.Where(kvp => !_changedKeys.Contains(kvp.Key) && _webSitePage.Session[kvp.Key] != null))
    foreach (var item in kvp.Values) // then for each observer
        item(_webSitePage.Session[key]); // call the registered delegate
2 голосов
/ 21 октября 2011
var keys = _dic.Keys.Where(key => _changedKeys.Contains(key) && 
                                  (_webSitePage.Session[key] != null));
foreach (var key in keys)
  foreach (var item in _dic[key])
    item(_webSitePage.Session[key]);

(второй тест не обязательно должен быть во внутреннем цикле foreach, если элемент не изменяет _webSitePage.Session)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...