IF 文字列内に繰り返し出現する 1 つまたは複数の文字があります。次の文字列のように:
1+1+1-2+2/2*4-2*3/23
上記の文字列では、のインデックスでの発生+
時間と他のインデックスでの発生時間などを 2 次元配列に格納します。問題は、これをどのように行うかです。3
1,3,7
-
2
5,13
次の関数は、指定された検索文字列に一致したすべてのインデックスを返します。
List<int> GetAllIndices(string input, string search)
{
List<int> result = new List<int>();
int index = input.IndexOf(search);
while(index != -1)
{
result.Add(index);
index++;//increment to avoid matching the same index again
if(index >= input.Length)//check if index is greater than string (causes exception)
break;
index = input.IndexOf(search, index);
}
return result;
}
また、重複一致も処理する必要があります。たとえば、次のように検索"iii"
し"ii"
ます。[0,1]
この関数を使用してシンボルとそのインデックスのリストを作成する場合は、次のアプローチをお勧めします。
string input = "1+1+1-2+2/2*4-2*3/23";
//create a dictionary to store the results
Dictionary<string, List<int>> results = new Dictionary<string, List<int>>();
//add results for + symbol
results.Add("+", GetAllIndices(input, "+"));
//add results for - symbol
results.Add("-", GetAllIndices(input, "-"));
//you can then access all indices for a given symbol like so
foreach(int index in results["+"])
{
//do something with index
}
さらに一歩進んで、複数のシンボルを検索する関数でそれをラップすることもできます。
Dictionary<string, List<int>> GetSymbolMatches(string input, params string[] symbols)
{
Dictionary<string, List<int>> results = new Dictionary<string, List<int>>();
foreach(string symbol in symbols)
{
results.Add(symbol, GetAllIndices(input, symbol));
}
return results;
}
次に、次のように使用できます。
string input = "1+1+1-2+2/2*4-2*3/23";
Dictionary<string, List<int>> results = GetSymbolMatches(input, "+", "-", "*", "/");
foreach(int index in results["+"])
{
//do something with index
}
「値」を変更してこれを試すことができます
var duplicates = param1.ToCharArray().Select((item, index) => new { item, index })
.Where(x =>x.item==VALUE).GroupBy(g=>g.index)
.Select(g => new { Key = g.Key })
.ToList();
シンプル=ベスト。メモリ割り当てなし。
public static IEnumerable<int> GetIndexOfEvery(string haystack, string needle)
{
int index;
int pos = 0;
string s = haystack;
while((index = s.IndexOf(needle)) != -1)
{
yield return index + pos;
pos = pos + index + 1;
s = haystack.Substring(pos);
}
}