如何从C#数组中获取仅出现一次的唯一元素
错误原因分析
Distinct()方法的作用仅为对序列做去重处理,只会把重复出现的元素保留单个实例。针对你给出的示例数组{11,11,11,14,11,11},去重后得到的序列是{11,14},调用First()自然返回第一个出现的11,和你要找「仅出现一次的元素」的需求完全不匹配。
修正后的实现代码
你可以通过分组统计元素出现次数的方式实现需求,最简LINQ写法如下:
public static int GetUnique(IEnumerable<int> numbers) { return numbers .GroupBy(num => num) .First(group => group.Count() == 1) .Key; }
如果需要兼容没有唯一出现元素的场景,避免抛出异常,可以调整为返回可空类型的版本:
public static int? GetUniqueOrDefault(IEnumerable<int> numbers) { return numbers .GroupBy(num => num) .FirstOrDefault(group => group.Count() == 1)? .Key; }
逻辑说明
GroupBy(num => num)会将序列中值相同的元素归为同一组,每个分组的Key为对应的元素值,分组内部包含所有该值的元素实例First(group => group.Count() == 1)会筛选出元素出现次数恰好为1的分组,也就是你要找的唯一元素对应的分组- 最后取分组的
Key即可得到目标值,针对你给出的示例数组运行后会正确返回14。
如果处理的序列元素量很大,还可以用字典计数优化性能,仅需遍历一次序列:
public static int GetUnique(IEnumerable<int> numbers) { Dictionary<int, int> countDict = new Dictionary<int, int>(); foreach (var num in numbers) { countDict[num] = countDict.TryGetValue(num, out int count) ? count + 1 : 1; } return countDict.First(kv => kv.Value == 1).Key; }
内容的提问来源于stack exchange,提问作者user16612111
相关产品推荐
相关产品推荐

