Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.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
使用LINQ在c#列表中的两个数字之间交换元素_C#_List_Linq - Fatal编程技术网

使用LINQ在c#列表中的两个数字之间交换元素

使用LINQ在c#列表中的两个数字之间交换元素,c#,list,linq,C#,List,Linq,我正在努力解决一个问题。我有这个清单:1,1,2,7,9,7,7,7,8,5,5,5,5,2,1,1,1,1,1。我需要得到2s之间的部分(2,7,9,7,7,8,5,5,5,5,5,2)。我只需要使用LINQ。我已经尝试过:test.SkipWhile(x=>x!=2).TakeWhile(x=>x!=2).Vypis(),但这始终不返回任何内容。Vypis()是扩展方法: static class Rozsireni { public static void Vypis<T&g

我正在努力解决一个问题。我有这个清单:1,1,2,7,9,7,7,7,8,5,5,5,5,2,1,1,1,1,1。我需要得到2s之间的部分(2,7,9,7,7,8,5,5,5,5,5,2)。我只需要使用LINQ。我已经尝试过:
test.SkipWhile(x=>x!=2).TakeWhile(x=>x!=2).Vypis(),但这始终不返回任何内容。Vypis()是扩展方法:

static class Rozsireni
{
    public static void Vypis<T>(this IEnumerable<T> a, string textPred = "")
    {
        Console.Write(textPred);
        foreach (T x in a)
            Console.Write("{0}, ", x);
        Console.WriteLine();
    }
}
静态类Rozireni
{
公共静态void Vypis(此IEnumerable a,字符串textPred=“”)
{
Console.Write(textPred);
foreach(T x in a)
写(“{0},”,x);
Console.WriteLine();
}
}
有人有什么想法吗?谢谢你的帮助和时间。
编辑:列表中还必须包含2。

我认为您应该首先跳过不等于2的数字,然后跳过等于2的数字,然后再次选取不等于2的数字并完成:

test.SkipWhile(x => x != 2).SkipWhile(x => x == 2).TakeWhile(x => x != 2).Vypis();
结果应该是:

7,9,7,7,7,8,5,5,5,5,5

编辑: 您编辑了您的问题,并指出您需要从头到尾
2
s。我不知道有什么单一而优雅的方法可以做到这一点。对不起,这可能看起来有点难看:

        var data = new int[] { 1, 1, 2, 7, 9, 7, 7, 7, 8, 5, 5, 5, 5, 5, 5, 2,2, 1, 1, 1, 1, 1 };


        var arr1 = data.SkipWhile(x => x != 2).TakeWhile(x => x == 2).ToArray();//select head 2 s
        var arr2 = data.SkipWhile(x => x != 2).SkipWhile(x => x == 2).TakeWhile(x => x != 2).ToArray();//select mids
        var arr3 = data.SkipWhile(x => x != 2).SkipWhile(x => x == 2).SkipWhile(x => x != 2).TakeWhile(x => x == 2).ToArray();//select tail 2s

        var arr = arr1.Concat(arr2).Concat(arr3);//concat them all
或者以紧凑的形式

test.SkipWhile(x => x != 2).TakeWhile(x => x == 2).ToArray().Concat(data.SkipWhile(x => x != 2).SkipWhile(x => x == 2).TakeWhile(x => x != 2).ToArray()).Concat(data.SkipWhile(x => x != 2).SkipWhile(x => x == 2).SkipWhile(x => x != 2).TakeWhile(x => x == 2).ToArray());

您的问题是传递给TakeWhile的数组是2,7,9,7,7,8,5,5,5,5,2,1,1,1,1,1,因此如果x!=2.即使你要跳过前2个和后2个,它也会跳过第2个2

test.SkipWhile(x => x != 2).TakeWhile((x, index) => x != 2 || index == 0).Vypis();
因此,您只需使用:

test.SkipWhile(x => x != 2).TakeWhile(x => x > 1).Vypis();

您应该跳过前2个:
test.SkipWhile(x=>x!=2)。跳过(1)。TakeWhile(x=>x!=2)是的,答案是肯定的。不只是一个2,所有的2都应该跳过。对不起,我忘了说我也需要这个2。请尝试:
test.GetRange(test.IndexOf(2),test.LastIndexOf(2)-1).Vypis()否,这就是问题所在。我也需要在列表中加入2,@jansumtný我已经更新了帖子,检查了head和tail
2
I尝试过,但仍然没有改变。它总是什么也不写。你自己试过吗?@jansumtný是的,你是对的,第二种方法不起作用,我已经把它去掉了。我认为不可能仅仅用SkipWhile和TakeWhile来解决你的问题,而是一个Concat或Union()。这重要吗?不重要。我想用什么就用什么。嗯。。。当然谢谢但如果2后没有1,那就行不通了。我需要通用代码,它适用于所有列表。但是非常感谢你!