2017-01-13 39 views
0

我有一個有序的對象列表,我想查找屬性更改的每個項目的索引,並獲取匹配索引到屬性的字典/列表對。例如,查找按字母順序排列的單詞列表中每個新的第一個字母的索引。如何使用Linq在屬性列表中查找具有不同值的列表中的第一項?

我可以用foreach循環做到這一點:

Initials = new Dictionary<char, int>(); 
int i = 0; 
foreach (var word in alphabeticallyOrderedList)) 
{ 
    if (!Initials.ContainsKey(word.First())) 
    { 
     Initials[word.First()] = i; 
    } 
    i++; 
} 

但我覺得應該有LINQ的這樣的一種優雅的方式。

+2

爲什麼?它的工作原理,使用LINQ並沒有增加任何好處 – Liam

+2

@Liam我同意查看功能時,但我發現LINQ更易讀,使我的代碼更加清晰。 – RandomStranger

+5

@RandomStranger:並不總是,特別是當索引很重要時。如果您使用大型LINQ查詢,則還會失去一些調試,異常處理和日誌記錄功能。 –

回答

3

你可以通過使用Select暴露指數的超載和使用GroupBy + ToDictionary與LINQ相同的功能:

Initials = alphabeticallyOrderedList 
    .Select((word, index) => new { Word = word, WordIndex = index }) 
    .GroupBy(x => x.Word[0]) 
    .ToDictionary(charGroup => charGroup.Key, charGroup => charGroup.First().WordIndex); 

但要引用自己:

LINQ並不總是更可讀性強,尤其是當索引很重要時。如果您使用大型LINQ查詢,您還會失去一些調試,異常處理和日誌功能

+0

謝謝,那些功能,我正在玩,但沒有管理正確組合! – Ollyver

+1

同意。這回答了這個問題,但foreach循環更具可讀性,可調試性,並且可能性更高。我唯一要做的就是清理OP的代碼,使用'for'循環並在那裏增加'i'變量。 – joelmdev

+1

我不知道你可以用'.Select'來自動獲取索引。很高興知道。 – Carson

相關問題