回答
public int GetNthIndex(string s, char t, int n)
{
int count = 0;
for (int i = 0; i < s.Length; i++)
{
if (s[i] == t)
{
count++;
if (count == n)
{
return i;
}
}
}
return -1;
}
,可能是做了很多更清洁,并有对输入不进行任何检查。
伟大的方法。漂亮干净,易于阅读,易于维护和卓越的性能。 – Mike 2014-02-22 15:57:54
喜欢这些循环,不仅他们表现出色,但你不能与他们出错,因为一切都是清澈透明的,就在你眼前。你写了一个linq,一些开发人员把它放在一个不理解成本的循环中,每个人都不知道性能瓶颈在哪里。 – user734028 2018-01-08 06:18:16
更新:索引第N的次数单行:
int NthOccurence(string s, char t, int n)
{
s.TakeWhile(c => n - (c == t)?1:0 > 0).Count();
}
你使用风险自担。这看起来像家庭作业,所以我留下了一些错误在那里为您找到:
int CountChars(string s, char t)
{
int count = 0;
foreach (char c in s)
if (s.Equals(t)) count ++;
return count;
}
。
int CountChars(string s, char t)
{
return s.Length - s.Replace(t.ToString(), "").Length;
}
。
int CountChars(string s, char t)
{
Regex r = new Regex("[\\" + t + "]");
return r.Match(s).Count;
}
乔尔的答案是好的(我赞成它)。这是一个基于LINQ的解决方案:
yourString.Where(c => c == 't').Count();
@Andrew--你可以通过跳过Where并将谓词传递给Count方法来缩短它。并不是说它的方式有什么问题。 – 2010-04-03 16:04:15
难道这不就是找到了一个字符有多少次出现而不是第n次出现? – dfoverdx 2015-06-26 16:21:47
下面是另一个LINQ的解决方案:
string input = "dtststx";
char searchChar = 't';
int occurrencePosition = 3; // third occurrence of the char
var result = input.Select((c, i) => new { Char = c, Index = i })
.Where(item => item.Char == searchChar)
.Skip(occurrencePosition - 1)
.FirstOrDefault();
if (result != null)
{
Console.WriteLine("Position {0} of '{1}' occurs at index: {2}",
occurrencePosition, searchChar, result.Index);
}
else
{
Console.WriteLine("Position {0} of '{1}' not found!",
occurrencePosition, searchChar);
}
只是为了好玩,这里是一个正则表达式的解决方案。我看到有些人最初使用Regex来计数,但是当问题改变时没有更新。这是如何使用正则表达式来完成 - 再一次,只是为了好玩。传统的方法最简单。
string input = "dtststx";
char searchChar = 't';
int occurrencePosition = 3; // third occurrence of the char
Match match = Regex.Matches(input, Regex.Escape(searchChar.ToString()))
.Cast<Match>()
.Skip(occurrencePosition - 1)
.FirstOrDefault();
if (match != null)
Console.WriteLine("Index: " + match.Index);
else
Console.WriteLine("Match not found!");
这是一个有趣的方式来做到这一点
int i = 0;
string s="asdasdasd";
int n = 3;
s.Where(b => (b == 'd') && (i++ == n));
return i;
另一种基于正则表达式的解决方案(未经测试):
int NthIndexOf(string s, char t, int n) {
if(n < 0) { throw new ArgumentException(); }
if(n==1) { return s.IndexOf(t); }
if(t=="") { return 0; }
string et = RegEx.Escape(t);
string pat = "(?<="
+ Microsoft.VisualBasic.StrDup(n-1, et + @"[.\n]*") + ")"
+ et;
Match m = RegEx.Match(s, pat);
return m.Success ? m.Index : -1;
}
这应该是略高于要求的正则表达式来创建一个更优化匹配集合,仅用于丢弃除一个匹配以外的所有内容。
作为对Matches集合评论的回应(因为这是我在回复中所展示的内容):我认为更有效的方法是使用while循环检查match.Success并获取NextMatch,计数器并在'counter == index'时提早打破。 – 2010-04-03 18:17:18
public static int FindOccuranceOf(this string str,char @char, int occurance)
{
var result = str.Select((x, y) => new { Letter = x, Index = y })
.Where(letter => letter.Letter == @char).ToList();
if (occurence > result.Count || occurance <= 0)
{
throw new IndexOutOfRangeException("occurance");
}
return result[occurance-1].Index ;
}
这里是一个递归实现 - 作为一个扩展方法,mimicing框架方法(S)的格式:
public static int IndexOfNth(
this string input, string value, int startIndex, int nth)
{
if (nth < 1)
throw new NotSupportedException("Param 'nth' must be greater than 0!");
if (nth == 1)
return input.IndexOf(value, startIndex);
return input.IndexOfNth(value, input.IndexOf(value, startIndex) + 1, --nth);
}
另外,这里有一些(MbUnit的)单元测试可以帮助你(以证明它是正确的):
[Test]
public void TestIndexOfNthWorksForNth1()
{
const string input = "foo<br />bar<br />baz<br />";
Assert.AreEqual(3, input.IndexOfNth("<br />", 0, 1));
}
[Test]
public void TestIndexOfNthWorksForNth2()
{
const string input = "foo<br />whatthedeuce<br />kthxbai<br />";
Assert.AreEqual(21, input.IndexOfNth("<br />", 0, 2));
}
[Test]
public void TestIndexOfNthWorksForNth3()
{
const string input = "foo<br />whatthedeuce<br />kthxbai<br />";
Assert.AreEqual(34, input.IndexOfNth("<br />", 0, 3));
}
ranomore正确评论Joel Coehoorn的单线不起作用。
这里是两个衬里确实工作,返回一个字符的第n次出现的基于0的索引字符串扩展方法,或-1,如果没有第n次出现存在:
public static class StringExtensions
{
public static int NthIndexOf(this string s, char c, int n)
{
var takeCount = s.TakeWhile(x => (n -= (x == c ? 1 : 0)) > 0).Count();
return takeCount == s.Length ? -1 : takeCount;
}
}
你可以用正则表达式来完成这项工作。
string input = "dtststx";
char searching_char = 't';
int output = Regex.Matches(input, "["+ searching_char +"]")[2].Index;
最好的方面。
以前的解决方案有一个小错误。
下面是一些更新的代码:
s.TakeWhile(c => (n -= (c == t ? 1 : 0)) > 0).Count();
如果找不到人物,它会返回什么? – 2014-09-29 10:53:14
它返回字符串s的长度/数量。你需要检查这个值。 – Yoky 2015-11-12 00:34:54
大家好我已经创建了两个重载方法寻找焦炭的第n次出现和文本用更少的复杂性,而无需通过环导航,从而提高性能你的申请。
public static int NthIndexOf(string text, char searchChar, int nthindex)
{
int index = -1;
try
{
var takeCount = text.TakeWhile(x => (nthindex -= (x == searchChar ? 1 : 0)) > 0).Count();
if (takeCount < text.Length) index = takeCount;
}
catch { }
return index;
}
public static int NthIndexOf(string text, string searchText, int nthindex)
{
int index = -1;
try
{
Match m = Regex.Match(text, "((" + searchText + ").*?){" + nthindex + "}");
if (m.Success) index = m.Groups[2].Captures[nthindex - 1].Index;
}
catch { }
return index;
}
由于内置IndexOf
功能已经为一个字符串中搜索字符优化,更快的版本将是(如扩展方法):
public static int NthIndexOf(this string input, char value, int n)
{
if (n <= 0) throw new ArgumentOutOfRangeException("n", n, "n is less than zero.");
int i = -1;
do
{
i = input.IndexOf(value, i + 1);
n--;
}
while (i != -1 && n > 0);
return i;
}
,或者从最终搜索使用LastIndexOf
字符串:
public static int NthLastIndexOf(this string input, char value, int n)
{
if (n <= 0) throw new ArgumentOutOfRangeException("n", n, "n is less than zero.");
int i = input.Length;
do
{
i = input.LastIndexOf(value, i - 1);
n--;
}
while (i != -1 && n > 0);
return i;
}
在搜索字符串而不是一个字符是从0123改变参数类型为简单至string
并且可选地添加超载以指定StringComparison
。
public int GetNthOccurrenceOfChar(string s, char c, int occ)
{
return String.Join(c.ToString(), s.Split(new char[] { c }, StringSplitOptions.None).Take(occ)).Length;
}
string result = "i am '[email protected]'"; // string
int in1 = result.IndexOf('\''); // get the index of first quote
int in2 = result.IndexOf('\'', in1 + 1); // get the index of second
string quoted_text = result.Substring(in1 + 1, in2 - in1); // get the string between quotes
我补充一点,运行非常快相比其他方法
private static int IndexOfNth(string str, char c, int nth, int startPosition = 0)
{
int index = str.IndexOf(c, startPosition);
if (index >= 0 && nth > 1)
{
return IndexOfNth(str, c, nth - 1, index + 1);
}
return index;
}
马克·卡尔斯LINQ扩展为通用另一个答案。
using System;
using System.Collections.Generic;
using System.Linq;
namespace fNns
{
public class indexer<T> where T : IEquatable<T>
{
public T t { get; set; }
public int index { get; set; }
}
public static class fN
{
public static indexer<T> findNth<T>(IEnumerable<T> tc, T t,
int occurrencePosition) where T : IEquatable<T>
{
var result = tc.Select((ti, i) => new indexer<T> { t = ti, index = i })
.Where(item => item.t.Equals(t))
.Skip(occurrencePosition - 1)
.FirstOrDefault();
return result;
}
public static indexer<T> findNthReverse<T>(IEnumerable<T> tc, T t,
int occurrencePosition) where T : IEquatable<T>
{
var result = tc.Reverse<T>().Select((ti, i) => new indexer<T> {t = ti, index = i })
.Where(item => item.t.Equals(t))
.Skip(occurrencePosition - 1)
.FirstOrDefault();
return result;
}
}
}
一些测试。
using System;
using System.Collections.Generic;
using NUnit.Framework;
using Newtonsoft.Json;
namespace FindNthNamespace.Tests
{
public class fNTests
{
[TestCase("pass", "dtststx", 't', 3, Result = "{\"t\":\"t\",\"index\":5}")]
[TestCase("pass", new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 },
0, 2, Result="{\"t\":0,\"index\":10}")]
public string fNMethodTest<T>(string scenario, IEnumerable<T> tc, T t, int occurrencePosition) where T : IEquatable<T>
{
Console.WriteLine(scenario);
return JsonConvert.SerializeObject(fNns.fN.findNth<T>(tc, t, occurrencePosition)).ToString();
}
[TestCase("pass", "dtststxx", 't', 3, Result = "{\"t\":\"t\",\"index\":6}")]
[TestCase("pass", new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 },
0, 2, Result = "{\"t\":0,\"index\":19}")]
public string fNMethodTestReverse<T>(string scenario, IEnumerable<T> tc, T t, int occurrencePosition) where T : IEquatable<T>
{
Console.WriteLine(scenario);
return JsonConvert.SerializeObject(fNns.fN.findNthReverse<T>(tc, t, occurrencePosition)).ToString();
}
}
}
,如果你的兴趣,你也可以创建字符串扩展方法,像这样:
public static int Search(this string yourString, string yourMarker, int yourInst = 1, bool caseSensitive = true)
{
//returns the placement of a string in another string
int num = 0;
int currentInst = 0;
//if optional argument, case sensitive is false convert string and marker to lowercase
if (!caseSensitive) { yourString = yourString.ToLower(); yourMarker = yourMarker.ToLower(); }
int myReturnValue = -1; //if nothing is found the returned integer is negative 1
while ((num + yourMarker.Length) <= yourString.Length)
{
string testString = yourString.Substring(num, yourMarker.Length);
if (testString == yourMarker)
{
currentInst++;
if (currentInst == yourInst)
{
myReturnValue = num;
break;
}
}
num++;
}
return myReturnValue;
}
public static int Search(this string yourString, char yourMarker, int yourInst = 1, bool caseSensitive = true)
{
//returns the placement of a string in another string
int num = 0;
int currentInst = 0;
var charArray = yourString.ToArray<char>();
int myReturnValue = -1;
if (!caseSensitive)
{
yourString = yourString.ToLower();
yourMarker = Char.ToLower(yourMarker);
}
while (num <= charArray.Length)
{
if (charArray[num] == yourMarker)
{
currentInst++;
if (currentInst == yourInst)
{
myReturnValue = num;
break;
}
}
num++;
}
return myReturnValue;
}
- 1. 查找分隔字符串中的第n个字符串
- 2. 在行中找到第n个字符串或子字符串
- 3. 如何在字符串中找到第n个字符?
- 4. 在字符串中查找字符串的第一个实例
- 5. SAS:如何在字符串中找到第n个字符/字符组的第n个实例?
- 6. 字符串中的第N个字
- 7. 在java中找到字符串中第n个子字符串的出现?
- 8. 在字符串中查找字符串
- 9. 在字符串中查找字符串
- 10. Perl替换字符串中的第n个子字符串
- 11. 替换字符串中出现的第n个子字符串
- 12. 在Python中分割第n个字符的字符串
- 13. 分割字符串在第n个字符保留字
- 14. 第n个字符
- 15. 在N个字符串中查找公共子字符串的算法
- 16. 查找数组字符串中的第一个字符
- 17. 查找字符串中的第一个非重复字符
- 18. 查找字符串中字符的第一个索引
- 19. 查找字符串中字符的第二个索引?
- 20. 从字符串中删除N个第一个字符
- 21. 如何从n个字符串中找到子字符串
- 22. php在字符串的第n个字符上添加不同的字符串
- 23. 找换行字符“\ n”的字符串
- 24. 在字符串中查找字符
- 25. 在另一个字符串中查找一个字符串的字符串
- 26. 查找字符串中的字符串
- 27. 查找字符串中的字符串
- 28. 查找字符串中的字符串
- 29. 在Swift中查找字符串中第N个子字符串实例的索引
- 30. Golang:如何从字符串中替换第n个字符
你怎么有这么远工作? – 2010-04-03 15:48:15
我编辑了你的答案,以更清楚地传达你想要的东西。希望你会得到一些适合这个问题的答案。在Stack Overflow上不能流利地使用英文不是一个问题,你总是可以添加一行,让其他人更流畅地编辑你的问题并清理它,但是你必须努力在问题中提供一些例子,以便人们理解什么你需要。 – 2010-04-03 16:04:15