在列表中查找连续重复项

时间:2016-04-29 10:12:51

标签: c# list duplicates

有很多方法可以找到在列表中查找重复项,是否可以在列表中找到连续重复项。

例如

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

4 个答案:

答案 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语句