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)
})
Просто и чисто!
Поскольку Вы хотите проверить на существование, возможно, попробуйте:
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));
Find()
возвращает найденный объект. Использовать Any()
просто проверять, верно ли выражение для какого-либо элемента.
var ces = companiesWithEmployees
.Find(x => x.Employees
.Any(y => y.PersonID == person.PersonID));
Поэтому Вы не указали, что законное Поисковое выражение для Вашего верхнего уровня Находит.
Я покажу его здесь:
ces = companiesWithEmployees
.Find (x => x.Employees.Find(y => y.ParID == Person.ParID) /*condition is missing here*/);
Таким образом, каково условие для Вашей начальной находки?
ces = companiesWithEmployees
.First(x => x.Employees.Any(p=>p.PersonID == person.PersonID));
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; }
}
Самый легкий был бы
ces = companiesWithEmployees.FirstOrDefault(x =>
x.Employees.Any(y => y.PersonID == person.ParID));
без любой пустой проверки