Лямбда-выражения, как искать в объекте?

API для хранилища Chrome является асинхронным, поэтому все, что мне нужно было сделать, это обработать его с помощью обещания или функции обратного вызова. Я выбрал опцию функции обратного вызова следующим образом:

function getColor(key, callback) {
    if (key !== null) {
        chrome.storage.local.get(key,function (obj){
            callback(obj)
        });
    }
}


getColor('color', function(color){
    console.log(color)
})

Просто и чисто!

7
задан buræquete 28 April 2017 в 12:51
поделиться

6 ответов

Поскольку Вы хотите проверить на существование, возможно, попробуйте:

ces = companiesWithEmployees
        .Find(x => x.Employees
        .Find(y => y.ParID == person.ParID) != null);

Это проверит на любого Person с тем же ParID; если Вы имеете в виду то же Person экземпляр (ссылка), затем Contains должен быть достаточным:

ces = companiesWithEmployees
        .Find(x => x.Employees.Contains(person));
15
ответ дан 6 December 2019 в 06:38
поделиться

Find() возвращает найденный объект. Использовать Any() просто проверять, верно ли выражение для какого-либо элемента.

var ces = companiesWithEmployees
    .Find(x => x.Employees
    .Any(y => y.PersonID == person.PersonID));
7
ответ дан 6 December 2019 в 06:38
поделиться

Поэтому Вы не указали, что законное Поисковое выражение для Вашего верхнего уровня Находит.

Я покажу его здесь:

ces = companiesWithEmployees
    .Find (x => x.Employees.Find(y => y.ParID == Person.ParID) /*condition is missing here*/);

Таким образом, каково условие для Вашей начальной находки?

0
ответ дан 6 December 2019 в 06:38
поделиться
ces = companiesWithEmployees
    .First(x => x.Employees.Any(p=>p.PersonID == person.PersonID));
3
ответ дан 6 December 2019 в 06:38
поделиться
ces = companiesWithEmployees.Find( x => x.Employees.Find(...) );

.Find возвраты только один объект, x.Employees.Find(..) возвраты Person.

.Find ожидает булев параметр (т.е. результат условий), вот почему существует ошибка компилятора, которая говорит Cannot implicit convert 'Person' To 'bool'

.Where может возвратить несколько объектов, следовательно может выполнить итерации через весь список.

используйте комбинацию .Where и .Any в Вашем случае.

следующий код проиллюстрирует различие между .Where, .Find, и .Any:

public partial class Form2 : Form {
    public Form2() {
        InitializeComponent();
        var companiesWithEmployees = new List<CompanyWithEmployees>() {                
            new CompanyWithEmployees {                 
                CompanyInfo = new Company { CompanyName = "Buen" },
                Employees = new List<Person>()  { 
                    new Person { PersonID = 1976, PersonName = "Michael" },
                    new Person { PersonID = 1982, PersonName = "Mark" },
                    new Person { PersonID = 1985, PersonName = "Matthew" },                            
                    new Person { PersonID = 1988, PersonName = "Morris" }
                }
            },
            new CompanyWithEmployees {
                CompanyInfo = new Company { CompanyName = "Muhlach" },
                Employees = new List<Person>() {
                    new Person { PersonID = 1969, PersonName = "Aga" },
                    new Person { PersonID = 1971, PersonName = "Nino" },
                    new Person { PersonID = 1996, PersonName = "Mark" }
                }
            },
            new CompanyWithEmployees {
                CompanyInfo = new Company { CompanyName = "Eigenmann" },
                Employees = new List<Person>() {
                    new Person { PersonID = 1956, PersonName = "Michael" },                        
                    new Person { PersonID = 1999, PersonName = "Gabby" }
                }
            }
        };

        // just explicitly declared the types (instead of var) so the intent is more obvious

        IEnumerable<CompanyWithEmployees> whereAreMichaels = companiesWithEmployees
            .Where(cx => cx.Employees.Any(px => px.PersonName == "Michael"));

        string michaelsCompanies = string.Join(", ", whereAreMichaels
            .Select(cx => cx.CompanyInfo.CompanyName).ToArray());

        MessageBox.Show("Company(s) with employee Michael : " + michaelsCompanies);

        Person findAga = companiesWithEmployees
            .Find(company => company.CompanyInfo.CompanyName == "Muhlach")
            .Employees.Find(person => person.PersonName == "Aga");

        if (findAga != null)
            MessageBox.Show("Aga's ID : " + findAga.PersonID.ToString());
    }
}

class CompanyWithEmployees { 
    public Company CompanyInfo { get; set; }
    public List<Person> Employees { get; set; }
}
class Company {
    public string CompanyName { get; set; }
}
class Person {
    public int PersonID { get; set; }
    public string PersonName { get; set; }
}
2
ответ дан 6 December 2019 в 06:38
поделиться

Самый легкий был бы

ces = companiesWithEmployees.FirstOrDefault(x => 
          x.Employees.Any(y => y.PersonID == person.ParID));

без любой пустой проверки

0
ответ дан 6 December 2019 в 06:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: