Преобразование динамического в лямбда-выражение - PullRequest
2 голосов
/ 13 мая 2011

Платформа кодирования: ASP.NET C # 4.0

У меня есть следующий фрагмент

public string PageID { get { return "20954654402"; } }
dynamic accounts = fb.Get("me/accounts");
if (accounts != null)
{
    bool isFound = false;
    foreach (dynamic account in accounts.data)
    {
        if (account.id == PageID)
        {
            isFound = true;
            break;
        }
    }
    if (!isFound)
    {
        //  user not admin
    }
    else
    {

    }
}

Два вопроса

  1. Почему (account.id == PageID)ошибки (PageID является строковым свойством) Обновление: это была глупая несвязанная ошибка, так как я вызываю все это в PageMethods.
  2. Существует ли более простой и более похожий на C # 4.0 способ изменить foreach loop?

Обновление:

Это ответ на звонок в Facebook API.Примером будет

{
    [{
        "name": "Codoons",
        "category": "Computers/technology",
        "id": "20954694402",
        "access_token": "179946368724329|-100002186424305|209546559074402|Hp6Ee-wFX9TEQ6AoEtng0D0my70"
    }, {
        "name": "Codtions Demo Application",
        "category": "Application",
        "id": "1799464329",
        "access_token": "179946368724329|-100002186424305|179946368724329|5KoXNOd7K9Ygdw7AMMEjE28_fAQ"
    }, {
        "name": "Naen's Demo Application",
        "category": "Application",
        "id": "192419846",
        "access_token": "179946368724329|61951d4bd5d346c6cefdd4c0.1-100002186424305|192328104139846|oS-ip8gd_1iEL9YR8khgrndIqQk"
    }]
}

Обновленный код также немного.

Намерение состоит в том, чтобы получить account.id, который совпадает с PageID, и получить access_token, связанный с этимaccount.id

Спасибо за ваше время.

Ответы [ 5 ]

1 голос
/ 13 мая 2011

Вы можете использовать методы LINQ для альтернативы foreach:

if(accounts.Any(a => a.id == PageID))
{
    //  user not admin
}
else
{

}

Относительно того, почему это «ошибки»: мы не можем этого сказать, потому что мы не знаем, какого типа id. Но если id имеет тип int, это объяснит ошибку.

0 голосов
/ 13 мая 2011

Вы должны использовать динамический предикат. Примерно так:


var pagesWithId = (Predicate)((dynamic x) => x.id == PageId);
var pagesFound = accounts.FindAll(pagesWithId);

if(pagesFounds.Count() > 0)
 //do your thing

0 голосов
/ 13 мая 2011
accounts.data.Any(a => a.id.ToString() == PageID)
0 голосов
/ 13 мая 2011

Когда используется == со строкой, т.е. PageID является строкой, то account.id также должен быть строкой, а не int или float, возможно, именно это и вызывает ошибку

0 голосов
/ 13 мая 2011

Если коллекцию учетных записей можно изменить (вставить, удалить) в другом потоке, то foreach при возникновении исключения выдаст исключение (простой цикл for не будет).

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