2012-11-15 63 views
4

我有一個鏈表結構如下:如何獲取鏈接列表中的數字索引?

LinkedList<int> linked = new LinkedList<int>(); 
var array = new int[] { 23, 55, 64, 65 }; 
foreach (var item in array) 
{ 
    linked.AddLast(item); 
} 

如何找到數64的指數?

+1

如果您需要基於索引的集合,請考慮使用'List '而不是鏈接列表。 – dtb

+1

[爲什麼LinkedList(T)不實現IList(T)接口?](http://stackoverflow.com/a/3584780/284240) –

+0

你確定'LinkedList'適合你的問題嗎? – Groo

回答

12

唯一的方法是按元素檢查元素並增加一個計數器(通過「唯一的方式」,我說像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(產生相同的時間複雜度)來完成。

+0

我正在指出你的答案是正確的,因爲答案應該總是易於理解,即使是書呆子 – Smartboy

+0

謝謝,很多@Groo – Smartboy

+0

@Smartboy:謝謝,但是LINQ並不難,一旦你習慣了它。我也更喜歡LINQ手動迭代,它更簡潔。這只是爲了展示算法。 – Groo

2
int index = linked.Select((item, inx) => new { item, inx }) 
        .First(x=> x.item == 64).inx; 
+0

它給了我的結果,但是請你詳細說明一下吧 – Smartboy

+0

用[圓形鏈表](http:// en.wikipedia.org/wiki/Linked_list#Circular_list)。 @Smartboy:這是linq,['Enumerable.Select'](http://msdn.microsoft.com/en-us/library/bb534869.aspx)和'Enumerable.Where'可以包含元素的索引。 –

+0

@TimSchmelter我一定錯過了一些東西。你如何從'LinkedList '創建一個循環鏈表? –

1

我認爲你應該讓你自己的函數來解析列表並檢查。 「查找」函數僅返回第一次出現,並且對於您,列表中可能有兩次或更多次出現64次。

+1

我不是那種在OP的情況下的問題。 ['IndexOf'](http://msdn.microsoft.com/en-us/library/8bd0tetb.aspx)以同樣的方式工作。 – Groo

2

這裏是一個替換的實施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不是找到。