我认为 Amy B 的答案让你非常接近,但在只有一个值的情况下它不会删除该值,这就是我认为原始发帖人正在寻找的。
这是一个扩展方法,它将删除所请求项目的单个实例,即使那是最后一个实例。这反映了 LINQ except() 调用,但仅删除第一个实例,而不是所有实例。
public static IEnumerable<T> ExceptSingle<T>(this IEnumerable<T> source, T valueToRemove)
{
return source
.GroupBy(s => s)
.SelectMany(g => g.Key.Equals(valueToRemove) ? g.Skip(1) : g);
}
给定:{"one", "two", "three", "three", "three"}
调用source.ExceptSingle("three")
结果{"one", "two", "three", "three"}
给定:{"one", "two", "three", "three"}
调用source.ExceptSingle("three")
结果{"one", "two", "three"}
给定:{"one", "two", "three"}
调用source.ExceptSingle("three")
结果{"one", "two"}
给定:{"one", "two", "three", "three"}
调用source.ExceptSingle("four")
结果{"one", "two", "three", "three"}