我有一個鏈表結構如下:如何獲取鏈接列表中的數字索引?
LinkedList<int> linked = new LinkedList<int>();
var array = new int[] { 23, 55, 64, 65 };
foreach (var item in array)
{
linked.AddLast(item);
}
如何找到數64的指數?
我有一個鏈表結構如下:如何獲取鏈接列表中的數字索引?
LinkedList<int> linked = new LinkedList<int>();
var array = new int[] { 23, 55, 64, 65 };
foreach (var item in array)
{
linked.AddLast(item);
}
如何找到數64的指數?
唯一的方法是按元素檢查元素並增加一個計數器(通過「唯一的方式」,我說像LINQ這樣的其他方法需要在內部做同樣的事情)。
一個手工編寫擴展方法會是這個樣子:
public static class LinkedListExt
{
public static int IndexOf<T>(this LinkedList<T> list, T item)
{
var count = 0;
for (var node = list.First; node != null; node = node.Next, count++)
{
if (item.Equals(node.Value))
return count;
}
return -1;
}
}
但它可以很容易地使用LINQ作爲@L.B wrote(產生相同的時間複雜度)來完成。
int index = linked.Select((item, inx) => new { item, inx })
.First(x=> x.item == 64).inx;
它給了我的結果,但是請你詳細說明一下吧 – Smartboy
用[圓形鏈表](http:// en.wikipedia.org/wiki/Linked_list#Circular_list)。 @Smartboy:這是linq,['Enumerable.Select'](http://msdn.microsoft.com/en-us/library/bb534869.aspx)和'Enumerable.Where'可以包含元素的索引。 –
@TimSchmelter我一定錯過了一些東西。你如何從'LinkedList
我認爲你應該讓你自己的函數來解析列表並檢查。 「查找」函數僅返回第一次出現,並且對於您,列表中可能有兩次或更多次出現64次。
我不是那種在OP的情況下的問題。 ['IndexOf'](http://msdn.microsoft.com/en-us/library/8bd0tetb.aspx)以同樣的方式工作。 – Groo
這裏是一個替換的實施LINQ避免創建匿名對象並返回-1如果該項目不在列表中:
int index = linked.Select((n, i) => n == 64 ? (int?)i : null).
FirstOrDefault(n => n != null) ?? -1;
它的數字序列轉換爲包含匹配的索引的序列否則爲null
。如果有一個,則需要第一個,否則將默認的int?
轉換爲-1
。
編輯:
這裏是一個更好(更簡單和更高性能的)的替代:
int i = linked.TakeWhile(n => n != 64).Count();
i
要麼等於索引,或等於linked.Count
如果值64
不是找到。
如果您需要基於索引的集合,請考慮使用'List'而不是鏈接列表。 –
dtb
[爲什麼LinkedList(T)不實現IList(T)接口?](http://stackoverflow.com/a/3584780/284240) –
你確定'LinkedList'適合你的問題嗎? – Groo