Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.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# Linq替换值直到第一个X值_C#_Linq - Fatal编程技术网

C# Linq替换值直到第一个X值

C# Linq替换值直到第一个X值,c#,linq,C#,Linq,我有一份清单: var l = new List<int?>{0,0,0,0,0,0,4,5,6,3,0,0,2,3}; 实际结果: {null,null,null,null,null,null,null,5,6,3,0,null,null,3} 预期结果: {null,null,null,null,null,null,4,5,6,3,0,0,2,3} : 请注意,此问题是对的重做。我认为这个问题有一定的局限性,所以我们开始吧。在Linq中实现这一点的一种方法是构建Replac

我有一份清单:

var l = new List<int?>{0,0,0,0,0,0,4,5,6,3,0,0,2,3};
实际结果:

{null,null,null,null,null,null,null,5,6,3,0,null,null,3}
预期结果:

{null,null,null,null,null,null,4,5,6,3,0,0,2,3}
:


请注意,此问题是对的重做。我认为这个问题有一定的局限性,所以我们开始吧。

在Linq中实现这一点的一种方法是构建ReplaceWhile函数:

计算有多少元素符合您的条件。 当你还没有达到这个职位时,用替补代替。 代码:


在Linq中实现这一点的一种方法是构建ReplaceWhile函数:

计算有多少元素符合您的条件。 当你还没有达到这个职位时,用替补代替。 代码:

我更喜欢,但这是另一个:

计算有多少元素符合您的条件。 跳过正确数量的元素后,将Substitute集合前置到源代码。 代码:

我更喜欢,但这是另一个:

计算有多少元素符合您的条件。 跳过正确数量的元素后,将Substitute集合前置到源代码。 代码:


我想出了一个解决办法。虽然没有那么优雅,但它可以工作并使用Select:

如果每个元素都为零,则此代码还将用null替换所有元素


这是一个在这两种情况下都能工作的例子:

这是我提出的一个解决方案。虽然没有那么优雅,但它可以工作并使用Select:

如果每个元素都为零,则此代码还将用null替换所有元素


下面是一个在这两种情况下都能工作的示例:

如果我们要创建一个扩展方法,我想我更喜欢这样:

public static IEnumerable<T> ReplaceWhile<T>(IEnumerable<T> source, Func<T, bool> predicate, T subsitute)
{
    var matching = true;
    foreach(var item in source)
        yield return !matching ? item : (matching = predicate(item)) ? subsitute : item;
}
每项只迭代一次,无需先迭代以查找索引或进行计数等


编辑:

如果我们要创建扩展方法,我想我更喜欢这样:

public static IEnumerable<T> ReplaceWhile<T>(IEnumerable<T> source, Func<T, bool> predicate, T subsitute)
{
    var matching = true;
    foreach(var item in source)
        yield return !matching ? item : (matching = predicate(item)) ? subsitute : item;
}
每项只迭代一次,无需先迭代以查找索引或进行计数等


编辑:

另一个不带辅助变量的解决方案:

var l = new List<int?>{0,0,0,0,0,0,4,5,6,3,0,0,2,3};
l = l.TakeWhile(x => x==0).Select(x => (int?)null).Concat(l.SkipWhile(x => x==0)).ToList();

没有辅助变量的另一种解决方案:

var l = new List<int?>{0,0,0,0,0,0,4,5,6,3,0,0,2,3};
l = l.TakeWhile(x => x==0).Select(x => (int?)null).Concat(l.SkipWhile(x => x==0)).ToList();

你能确认你想更改现有列表,而不是创建一个新列表吗?@MatthewWatson我可以创建另一个列表。哦,我明白你后来说的了。你能确认你想更改现有列表,而不是创建一个新列表吗?@MatthewWatson我可以创建另一个列表。我明白你后来说的了我忘了FindIndex了。此解决方案使用与相同的逻辑,但依赖于列表的内置项。不过,我们不太通用。这是一个很好的解决方案:啊,编辑得不错。我意识到当我们有firstIndex时,检查项是否为0是没有意义的。我忘记了FindIndex。此解决方案使用与相同的逻辑,但依赖于列表的内置项。不过,我们不太通用。这是一个很好的解决方案:啊,编辑得不错。我意识到,当我们有firstIndex时,检查项是否为0是没有意义的。正在研究解决方案吗?美好的不过,我不喜欢三元结构中的赋值。投票表决。一个正在研究的解决方案?美好的不过,我不喜欢三元结构中的赋值。投票表决。
var l = new List<int?> { 0, 0, 0, 0, 0, 0, 4, 5, 6, 3, 0, 0, 2, 3 };
var firstIndex = l.FindIndex(x => x != 0);
var m = l.Select((item, index) => firstIndex == -1 || index < firstIndex ? null : item);
public static IEnumerable<T> ReplaceWhile<T>(IEnumerable<T> source, Func<T, bool> predicate, T subsitute)
{
    var matching = true;
    foreach(var item in source)
        yield return !matching ? item : (matching = predicate(item)) ? subsitute : item;
}
var l = new List<int?>{0,0,0,0,0,0,4,5,6,3,0,0,2,3};
l = l.TakeWhile(x => x==0).Select(x => (int?)null).Concat(l.SkipWhile(x => x==0)).ToList();