Nếu bạn muốn chỉ số của nguyên tố này, điều này sẽ làm điều đó:
int index = list.Select((item, i) => new { Item = item, Index = i })
.First(x => x.Item == search).Index;
// or
var tagged = list.Select((item, i) => new { Item = item, Index = i });
int index = (from pair in tagged
where pair.Item == search
select pair.Index).First();
Bạn không thể thoát khỏi những lambda trong đèo đầu tiên.
Lưu ý rằng điều này sẽ ném nếu mục không tồn tại. Điều này giải quyết vấn đề bằng cách phải dùng đến ints nullable:
var tagged = list.Select((item, i) => new { Item = item, Index = (int?)i });
int? index = (from pair in tagged
where pair.Item == search
select pair.Index).FirstOrDefault();
Nếu bạn muốn mục:
// Throws if not found
var item = list.First(item => item == search);
// or
var item = (from item in list
where item == search
select item).First();
// Null if not found
var item = list.FirstOrDefault(item => item == search);
// or
var item = (from item in list
where item == search
select item).FirstOrDefault();
Nếu bạn muốn đếm số lượng các mục phù hợp:
int count = list.Count(item => item == search);
// or
int count = (from item in list
where item == search
select item).Count();
Nếu bạn muốn tất cả các mục phù hợp:
var items = list.Where(item => item == search);
// or
var items = from item in list
where item == search
select item;
Và đừng quên kiểm tra danh sách cho null
trong bất kỳ trường hợp nào trong số này.
Hoặc sử dụng (list ?? Enumerable.Empty<string>())
thay vì list
.
Cảm ơn Pavel đã giúp đỡ trong các nhận xét.
Nguồn
2009-07-24 03:46:40
Đó là tuyệt vời. Tuy nhiên, đó là tất cả các phong cách biểu thức lamda. Tôi sử dụng một danh sách đơn giản ở đây. Danh sách có thể là một lớp với nhiều thuộc tính và một số được sử dụng để tìm kiếm. Vì vậy, bất kỳ cách nào LINQ để tìm kiếm như "từ .. trong ... nơi ... chọn ..." –
Không, xin lỗi. Hầu hết các phương thức này (Đầu tiên, Đơn, Bất kỳ, ...) không thể được * trực tiếp * được dịch sang biểu mẫu đó. –
Nevermind, thực sự bạn có thể loại bỏ lambdas trong một vài trường hợp ... –