C# 为什么我会在这里得到一个IndexOutOfRangeException?
我不明白为什么我会在下面的C# 为什么我会在这里得到一个IndexOutOfRangeException?,c#,algorithm,linq,C#,Algorithm,Linq,我不明白为什么我会在下面的Where子句中得到它 using System; using System.Linq; public static class Extensions { /// <summary> /// Removes consecutive characters, /// e.g. "aaabcc" --> "abc" /// </summary> public static void RemoveDupli
Where
子句中得到它
using System;
using System.Linq;
public static class Extensions
{
/// <summary>
/// Removes consecutive characters,
/// e.g. "aaabcc" --> "abc"
/// </summary>
public static void RemoveDuplicates(this string s)
{
var arr = s.ToCharArray()
.Where((i,c) => (i > 0) ? (c != s[i - 1]) : true)
.ToArray();
s = new string(arr);
}
}
public class Program
{
public static void Main()
{
var str = "aaabcc";
str.RemoveDuplicates();
Console.WriteLine(str);
}
}
使用系统;
使用System.Linq;
公共静态类扩展
{
///
///删除连续字符,
///例如,“aaabcc”->“abc”
///
公共静态void RemoveDuplicates(此字符串为s)
{
var arr=s.ToCharArray()
其中((i,c)=>(i>0)?(c!=s[i-1]):真)
.ToArray();
s=新字符串(arr);
}
}
公共课程
{
公共静态void Main()
{
var str=“aaabcc”;
str.RemoveDuplicates();
控制台写入线(str);
}
}
另外,在仍然使用LINQ的情况下,是否有一种方法可以使其更加高效和紧凑?这里的参数顺序错误:
.Where((i, c) => (i > 0) ? (c != s[i - 1]) : true)
应成为:
.Where((c, i) => (i > 0) ? (c != s[i - 1]) : true)
为此,您可以使用方法代替自己的方法:
var str = "aaabcca";
var result = string.Join("",str.ToCharArray().Distinct());
结果:
“abc”
编辑:如果要删除连续的重复项,可以尝试以下代码:
var removesequential = string.Join("",str.Where((c, i) => i == 0 || c != str[i - 1]));
结果:
“abca”
在使用方法或特殊重载之前,您可能需要阅读: 类型:
System.Func
用于测试每个源元素的条件的函数;第二个
函数的参数表示源元素的索引
所以你的代码应该是这样的:
.Where((item, index) => (index > 0) ? (item != s[index - 1]) : true)
错误是where中的(i,c)
您正在使用以下可枚举扩展
- 注意,由于检查string是否为null,我确信存在First()
- 由于跳过(1),where语句中的索引0等于s[1],对于i>0,索引i等于s[i-1]
(i,c)切换到(c,i)
虽然Distinct
做了一些不同的事情,但他的代码试图删除顺序重复项,但Distinct是全局重复项。
public static IEnumerable<TSource> Where<TSource>(
this IEnumerable<TSource> source,
Func<TSource, int, bool> predicate)
public static string RemoveDuplicates(this string s)
{
if (String.IsNullOrEmpty(s)) return String.Empty(); // optional: return null
var resultBuilder = new StringBuilder(s.Length);
resultBuilder.Append(s.First());
for (int i=1; i< s.Length; ++i)
{
if (s[i] != s[i-1])
resultBuilder.Append(s[i]);
}
return resultBuilder.ToString();
}
public static string RemoveDuplicates(this string s)
{
if (String.IsNullOrEmpty(s)) return String.Empty();
s.AsEnumerable().Take(1)
.Concat(s.AsEnumerable().Skip(1)
.where( (c, i) => c != s[i]));
}