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