例如考慮一個物件串列:
List<MyClass> myList;
我有一個方法可以傳遞對串列中專案的兩個參考。我想迭代給定專案中的所有專案(注意:我不知道這兩個專案中的哪一個在串列中排在第一位):
privat void MyFunction(MyClass listItem, MyClass anotherListItem)
{
foreach(var item in ????)
{
// do something
}
}
目前我已經解決了這個用例如下:
int listItemIdx = myList.IndexOf(listItem);
int anotherListItemIdx = myList.IndexOf(anotherListItem);
if(listItemIdx < anotherListItemIdx )
{
for(int i = listItemIdx ; i <= anotherListItemIdx ; i )
{
// do stuff
}
}
else
{
for (int i = anotherListItemIdx ; i < listItemIdx ; i )
{
// do stuff
}
}
我想知道這個問題是否有更優雅、更高效或內置的解決方案?
uj5u.com熱心網友回復:
如果您正在尋找性能(IndexOf兩次可能會有點慢)和泛化
(當myList不是必需的List<T>,但IEnumerable<T>只是),您可以將其視為
bool proceed = false;
MyClass lastItem = default;
foreach (var item in myList) {
if (!proceed) {
if (proceed = item == listItem)
lastItem = anotherListItem;
else if (proceed = item == anotherListItem)
lastItem = listItem;
}
if (proceed) {
//TODO: do staff here
if (item == lastItem)
break;
}
}
uj5u.com熱心網友回復:
您在串列中迭代三次:兩次 in IndexOf,然后再次在您的回圈中。您可以使用此代碼提高代碼效率,該代碼僅在串列中迭代一次。
privat void MyFunction(MyClass listItem, MyClass anotherListItem)
{
bool betweenTwoItems = false;
foreach(var item in myList)
{
if(item == listItem || item == anotherListItem)
{
betweenTwoItems = !betweenTwoItems;
if(!betweenTwoItems)
{
break;
}
}
if(betweenTwoItems )
{
// do stuff
}
}
}
如果我們在兩個專案之間,我們設定一個布爾變數。一開始是假的。我們遍歷串列并檢查當前項是否是兩個方法引數之一。如果是這種情況,我們反轉布林值。如果在布爾反轉后值為假,我們可以離開串列。之后,我們檢查 bool 是否為真。如果是這樣,我們可以做一些事情。
在線演示:https ://dotnetfiddle.net/xYcr7V
uj5u.com熱心網友回復:
串列是否排序?您可以使用該事實來實作哪個專案必須是第一個。不過,如果您愿意,您可以使用一個 for 回圈:
private static void MyFunction(string item1, string item2)
{
List<string> input = new() {"A", "B", "C", "D", "E"};
int index1 = input.IndexOf(item1);
int index2 = input.IndexOf(item2);
int beginIndex = Math.Min(index1, index2);
int count = Math.Abs(index1 - index2) 1;
foreach (string item in input.GetRange(beginIndex, count))
{
Console.Write(item);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/436622.html
下一篇:從SQL中獲取所有包含特定值的值
