linq 从List中删除符合索引条件的元素

jgovgodb  于 2023-05-11  发布在  其他
关注(0)|答案(3)|浏览(214)

我被要求创建一个函数,该函数从一个整数列表中删除所有符合指定条件的元素,即。该元素是其索引的倍数。
用迭代之类的东西来做这件事非常容易,但我想用一种“更可爱”的方式来做,只是为了进入更复杂的编写代码,Linq和Lambdas。
我也试过

public static List<int> MultipleOfIndex(List<int> xs) =>
    xs.RemoveAll(s => (s % xs.IndexOf(s) == 0));

但我得到以下错误:错误CS 0029:无法将类型“int”隐式转换为“System.Collections.Generic.List”
我真的不明白我在哪里做隐式转换,因为我的逻辑是这样的:我想删除所有的元素 s 其中s模他的索引是0。我想有一个解释,我也想看看我如何也实现它与在哪里/选择子句。
先谢谢你了!

h5qlskok

h5qlskok1#

如果要修改原始列表,可以使用以下方法(注意需要处理一个被零除的操作)

public static List<int> MultipleOfIndex(List<int> xs)
{
    xs.RemoveAll(s => xs.IndexOf(s) == 0 && s != 0 || s % xs.IndexOf(s) == 0);
    return xs;
}

更有效的版本可能是:

public static List<int> MultipleOfIndex(List<int> xs)
{
    for (var i = xs.Count - 1; i >= 0; i--)
    {
        if(i == 0 && xs[i] != 0 || xs[i] % i == 0)
            xs.RemoveAt(i);
    }
    return xs;
}

如果要创建新列表,可以使用LINQ

public static List<int> MultipleOfIndex(List<int> xs) =>
    xs.Where((s, index) => index == 0 && s == 0 || s % index != 0).ToList();
vfh0ocws

vfh0ocws2#

我认为最好将列表Map到元组列表中,第一个元素是索引,第二个元素是值,原因是removeAll()可能是并行的,从而导致算法不一致。这样我相信你也不会遇到问题(虽然我没有尝试过)。

rdlzhqv9

rdlzhqv93#

你只需要使用Where predicate (问题是index = 0)

var result = listofInt.Where((x, i) => i != 0 && x % i != 0).ToList();

i表示listOfInt中项目x的索引

相关问题