[Tip][LINQ] 查詢符合條件項目之順位(Index)

查詢首個符合條件項目之順位(Index)

前言

 

最近心血來潮使用LINQ處理字串時,發現居然沒有辦法取得第一個符合篩選條件的項目順位! 面對這個問題可以有兩種解決方案,首先就是直接實作一個IEnumerable擴充功能來完成任務;或是用點小技巧來把資料項目與順位資訊包裹起來再進行條件的搜尋。以下介紹。

 

 

實作

 

目前有個字串,希望利用 Regular Expression 來取出第一個小寫字母語字串中的位置。

 


{
	string str = "1234a678";
	var regex = new Regex("[a-z]", RegexOptions.None);
}

 

首先就是實作一個FindIndex的IEnumerable擴充功能。如下所示。

 


{
	public static int? FindIndex<T>(this IEnumerable<T> items, Func<T, bool> predicate) 
	{
		int index = 0;
		foreach (var item in items) {
			if (predicate(item)) return index;
			index++;
		}
		
		return null;
	}
}

 

測試代碼如下

 


{
	string str = "01234a678";
	var regex = new Regex("[a-z]", RegexOptions.None);
	
	var lowerCharIndex = str.AsEnumerable().FindIndex(s=>regex.Match(s.ToString()).Success);
	lowerCharIndex.Dump();
}

 

可以正確取出符合條件之項目位置

 

image

 

如果需要取出多筆資料順位時,就須在Select資料時用點小技巧來實現。首先將查詢資料項目(item)與順位(index)先包成匿名型別類別,然後再針對此物件進行條件篩選;當取得符合條件項目時,就可以從此匿名型別物件中取出符合條件項目(item)與順位(index)。

 


{
	string str = "01234a678";
	var regex = new Regex("[a-z]", RegexOptions.None);

	var lowerChar = str.AsEnumerable()
                	   .Select((item, index) => new {item, index})
                	   .FirstOrDefault(n=> regex.Match(n.item.ToString()).Success);
						
	if (lowerChar != null)
	{ 
		// found matching item
		lowerChar.item.Dump(); 
		lowerChar.index.Dump(); 
	}
}

 

測試結果如下,同樣可以正確取出符合條件之項目位置。

 

image

 

 

參考資訊

 

http://stackoverflow.com/questions/2471588/how-to-get-index-using-linq


希望此篇文章可以幫助到需要的人

若內容有誤或有其他建議請不吝留言給筆者喔 !