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();