当您在allletters 上调用Replace 时,将创建一个新字符串。 Replace 不修改存在的字符串。
为了使您的代码正常工作,您应该在每次迭代时重新分配 allletters:
allletters = allletters.Replace(....)
或者只使用这个单行 linq 查询:
string allletters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
string notusedletters = new string(
allletters.Except(
DriveInfo.GetDrives().Select(d => d.Name[0])
).ToArray());
来自 cmets:
需要注意的是,Except不保证订单被保留
我检查了this 的答案,它说Except 保留了顺序。为了确保我已经反编译 System.Core
请使用我的 cmets 查看 Except 的实现:
public static IEnumerable<TSource> Except<TSource>(
this IEnumerable<TSource> first,
IEnumerable<TSource> second)
{
// I removed a null checks
return Enumerable.ExceptIterator<TSource>(first, second,
(IEqualityComparer<TSource>) null);
}
private static IEnumerable<TSource> ExceptIterator<TSource>(
IEnumerable<TSource> first,
IEnumerable<TSource> second,
IEqualityComparer<TSource> comparer)
{
Set<TSource> set = new Set<TSource>(comparer);
foreach (TSource source in second)
set.Add(source);
foreach (TSource source in first)
{
if (set.Add(source))
yield return source; // elements will be yielded in same order
// as they appear in first sequence
}
}
但要 100% 确保将来行为不会改变,您可以使用 @ckuri 在评论中建议的 OrderBy:
string notusedletters = new string(
allletters.Except(
DriveInfo.GetDrives().Select(d => d.Name[0])
)
.OrderBy(c => c) // explicit ordering
.ToArray()
);