Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我会在这里得到一个IndexOutOfRangeException?_C#_Algorithm_Linq - Fatal编程技术网

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]

我认为情况正好相反,第一个元素是char,第二个元素是index。因此,将
(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]));
}