gpt4 book ai didi

c# - 使用Linq查找连续的重复元素

转载 作者:太空狗 更新时间:2023-10-29 20:06:34 25 4
gpt4 key购买 nike

假设我有一个列表,其中包含 Value 类型的对象。 Value 有一个 Name 属性:

private List<Value> values = new List<Value> {
new Value { Id = 0, Name = "Hello" },
new Value { Id = 1, Name = "World" },
new Value { Id = 2, Name = "World" },
new Value { Id = 3, Name = "Hello" },
new Value { Id = 4, Name = "a" },
new Value { Id = 5, Name = "a" },
};

现在我想获取所有“重复”值的列表(name 属性与前一个元素的 name 属性相同的元素)。
在此示例中,我希望返回一个包含两个元素“world”和“a”(id = 2 和 5)的列表。

这个事件可以用 linq 实现吗?我当然可以……像这样:

List<Value> tempValues = new List<Value>();
String lastName = String.Empty();
foreach (var v in values)
{
if (v.Name == lastName) tempValues.Add(v);
lastName = v.Name;
}

但由于我想在更复杂的上下文中使用此查询,也许有一个“linqish”解决方案。

最佳答案

不会有任何内置的东西,但如果你经常需要这个,你可以推出一些定制但相当通用的东西:

static IEnumerable<TSource> WhereRepeated<TSource>(
this IEnumerable<TSource> source)
{
return WhereRepeated<TSource,TSource>(source, x => x);
}
static IEnumerable<TSource> WhereRepeated<TSource, TValue>(
this IEnumerable<TSource> source, Func<TSource, TValue> selector)
{
using (var iter = source.GetEnumerator())
{
if (iter.MoveNext())
{
var comparer = EqualityComparer<TValue>.Default;
TValue lastValue = selector(iter.Current);
while (iter.MoveNext())
{
TValue currentValue = selector(iter.Current);
if (comparer.Equals(lastValue, currentValue))
{
yield return iter.Current;
}
lastValue = currentValue;
}
}
}
}

用法:

    foreach (Value value in values.WhereRepeated(x => x.Name))
{
Console.WriteLine(value.Name);
}

您可能想考虑如何处理三胞胎等 - 目前除了第一个之外的所有东西都会产生(符合您的描述),但这可能不太正确。

关于c# - 使用Linq查找连续的重复元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1012324/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com