C# 首次使用LINQ找到重复元素(不连续)

C# 首次使用LINQ找到重复元素(不连续),c#,C#,如何打印阵列中的第一个重复元素 var arr = new int[]{ 3, 2, 5, 1, 5, 4, 2, 15 }; 目前,此方法打印2而不是5 public int FirstDuplicate(int[] arr) { var firstDup = arr .GroupBy(x => x) .Where(grp => grp.Count() == 2) .Select(grp =&g

如何打印阵列中的第一个重复元素

var arr = new int[]{ 3, 2, 5, 1, 5, 4, 2, 15 };
目前,此方法打印2而不是5

 public int FirstDuplicate(int[] arr)
    {
        var firstDup = arr
          .GroupBy(x => x)
          .Where(grp => grp.Count() == 2)
          .Select(grp => grp.Key)
          .FirstOrDefault();

        if (firstDup > 0) return firstDup;

        return -1;

    }

您可以编写一个扩展metod,该扩展metod将返回IEnumerable类的所有副本


这对我来说很有效。我利用了将值与数组索引、Distinct方法和结果数组的第一个元素进行比较的优势

var arr = new int[] { 3, 2, 5, 5, 4, 2, 15 };
var adjacentDuplicate = arr.Skip(1)     // Skip first
    .Where((value,index) => value == arr[index])
    .Distinct()
    .ToArray();     // Convert to array

if (adjacentDuplicate.Any())
{    
    Console.WriteLine(adjacentDuplicate[0]);    // Print first duplicate
}
else
{
   // No duplicates found.
}

根据鲁福爵士的回答,我将做两次扩展

public static IEnumerable<T> Duplicates<T>(this IEnumerable<T> source)
{
    var hashset = new HashSet<T>();
    foreach (var item in source)
    {
        if (!hashset.Add(item))
        {
            yield return item;
        }
    }
}

public static IEnumerable<T?> AsNullable<T>(this IEnumerable<T> source) where T : struct
{
    return source.Select(x => (T?)x);
}

AsNullableConvertingint为int?没有硬编码的类型。当结果为null时,不存在重复性。您可以在更多情况下使用它,例如计算不可为null的值的潜在空序列的最大值,您也可以为IQueryable定义它。这个扩展的优点是,当您使用它时,您肯定知道null在源代码中不是有效值。当空值突然变成一个可能的值时,你就不会自食其果。

数组中有两个重复项,2和5,前2是数组中的第二个元素,前5是第三个元素只是为了澄清一下:如果数组包含{2,5,3,5,2},你会期望得到什么结果?2.还是什么都没有?@PavelAnikhouski Steve是唯一一个真正能回答这个问题的人——我们其他人只能回答guess@Isma这不是你的问题,你不应该改变任何其他问题的含义-你可以问你自己的问题,无论你有什么意思like@Steve因此,您认为LINQ to Objects方法实现不使用需要额外的空间时?当然,它们是这样做的——举几个例子:Join、GroupJoin、GroupBy、Distinct等等,它们使用的空间比Rufo爵士的定制方法多得多。LINQ不是万能的。@Zer0它是万能的-你自己试试,或者仔细阅读代码。它不是万能的。我能很好地读懂代码。Duplicates将为数组int[]{5,2 5}@Zero返回5此扩展方法用于此问题-您可能没有想到其他扩展方法-此方法将从问题{5,2}中的给定数组返回,因为OP expectedI认为您不理解此问题。问题是如何打印第一个连续副本。这个答案实际上根本不涉及相邻元素。您的扩展方法会返回所有重复项。@Zer0从OP I Doe rollback中读取原始问题,现在每个人都可以看到。“连续”一词不是来自OPNice。它起作用了。我可以知道和hashset相比,空间和时间复杂度是如何的吗?请注意,Distinct不能保证保持顺序。
var arr = new int[] { 3, 2, 5, 5, 4, 2, 15 };
var adjacentDuplicate = arr.Skip(1)     // Skip first
    .Where((value,index) => value == arr[index])
    .Distinct()
    .ToArray();     // Convert to array

if (adjacentDuplicate.Any())
{    
    Console.WriteLine(adjacentDuplicate[0]);    // Print first duplicate
}
else
{
   // No duplicates found.
}
public static IEnumerable<T> Duplicates<T>(this IEnumerable<T> source)
{
    var hashset = new HashSet<T>();
    foreach (var item in source)
    {
        if (!hashset.Add(item))
        {
            yield return item;
        }
    }
}

public static IEnumerable<T?> AsNullable<T>(this IEnumerable<T> source) where T : struct
{
    return source.Select(x => (T?)x);
}
var duplicate = arr
    .Duplicates()
    .AsNullable()
    .FirstOrDefault();