Đây là cách thực hiện trong một (dài) dòng bằng LINQ, chỉ với một lần đi qua bộ sưu tập. Nó sẽ làm việc cho bất kỳ IEnumerable<int>
, không chỉ danh sách.
int maxIndex = intList
.Select((x, i) => new { Value = x, Index = i })
.Aggregate
(
new { Value = int.MinValue, Index = -1 },
(a, x) => (a.Index < 0) || (x.Value > a.Value) ? x : a,
a => a.Index
);
Dưới đây là tương đương phi LINQ ở trên, sử dụng một vòng lặp foreach
. (Một lần nữa, chỉ cần một lần đi qua bộ sưu tập và sẽ hoạt động cho bất kỳ IEnumerable<int>
nào.)
int maxIndex = -1, maxValue = int.MinValue, i = 0;
foreach (int v in intList)
{
if ((maxIndex < 0) || (v > maxValue))
{
maxValue = v;
maxIndex = i;
}
i++;
}
Nếu bạn biết rằng bộ sưu tập là một IList<int>
sau đó một đồng bằng for
vòng lặp có lẽ là giải pháp đơn giản nhất:
int maxIndex = -1, maxValue = int.MinValue;
for (int i = 0; i < intList.Count; i++)
{
if ((maxIndex < 0) || (intList[i] > maxValue))
{
maxValue = intList[i];
maxIndex = i;
}
}
Không đơn giản, không nhanh. – watbywbarif
Có thể nó không đơn giản như bạn muốn, nhưng nó được trình bày nhanh nhất ở đây. Giải nén nó vào một phương pháp mở rộng và quên nó đi. Tôi rất muốn thấy sự lựa chọn của bạn. Downvoting câu trả lời tốt nhất bởi vì bạn không thích nó chỉ là trẻ con. – jpbochi
Nếu nó nhanh hơn Matt Howells và Jon Skeets tôi sẽ ăn năn bản thân mình và không bao giờ sử dụng lại. – watbywbarif