有很多方法可以找到在列表中查找重复项,是否可以在列表中找到连续重复项。
例如
List<string> stringList = new List<string>();
stringList.Add("Name1");
stringList.Add("Name2");
stringList.Add("Name1");
除了
之外什么也找不到stringList.Add("Name1");
stringList.Add("Name1");
stringList.Add("Name2");
应返回1条
这会返回重复项。
var q = listString.GroupBy(x => x)
.Select(g => new { Value = g.Key, Count = g.Count() })
.OrderByDescending(x => x.Count);
答案 0 :(得分:2)
这是一种返回重复项及其索引的方法:
var duplicates =
stringList
.Select((x,i) => new {Item = x, Index = i})
.Skip(1) //We start with the second item
.Where(y => y.Item == stringList[y.Index-1])
.ToList();
答案 1 :(得分:2)
由于您询问“如果我们可以获得哪个项目是重复的并且开始索引和出现次数”,那么这是该特定要求的解决方案。
这输出以下内容:
<f:form action="create" method="POST" enctype="multipart/form-data" name="newAnswer" controller="Answer" object="{newAnswer}"
arguments="{ticket:ticket}">
<f:form.select class="form-control" property="ticket.status" name="status" options="{status}"
optionLabelField="title"
optionValueField="uid" />
</f:form>
以下是代码:
2 was repeated 2 times starting at index 1
3 was repeated 3 times starting at index 4
4 was repeated 4 times starting at index 8
答案 2 :(得分:1)
为什么不存储最后一项?像这样的东西
public static partial class EnumerableExtensions {
// Simplest; IEquatable<T> for advanced version
public static IEnumerable<T> Continuous<T>(this IEnumerable<T> source) {
if (null == source)
throw new ArgumentNullException("source");
T lastItem = default(T);
Boolean first = true;
foreach (var item in source) {
if (first) {
lastItem = item;
first = false;
}
else if (Object.Equals(item, lastItem))
yield return item;
else
lastItem = item;
}
}
}
然后
List<string> stringList = new List<string>() {
"Name1",
"Name1",
"Name2",
};
var contDups = stringList
.Continuous()
.ToList();
答案 3 :(得分:1)
您可以从定义项目“连续重复”的含义开始:
位置
i
的项目是连续副本,如果它与位置i-1
的项目相同
将值与先前位置中的另一个值进行比较的一种方法是使用Zip
将列表“移位”一个元素:
var consecutiveDuplicates = list.Skip(1)
.Zip(list, (me, prior) => new {ThisItem = me, Prior = prior})
.Where(p => p.ThisItem == p.Prior)
.Select(p => p.ThisItem) // Both sides are equal, pick either one
.ToList();
list.Skip(1).Zip(list,...)
表达式将列表与自身组合,移位为1,因此您可以获取此元素及其先前元素,用于定义前一元素的N-1个位置。其余的是将英语定义直接翻译成LINQ语句