- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我有两个列表,分别包含源文件名和目标文件名列表。
Sourcefilenamelist 的文件为 1.txt、2.txt、3.txt、4.txt
而 Destinaitonlist 有 1.txt,2.txt。
我需要编写一个 linq 查询来找出 SourceList 中哪些文件不在 DestinationFile 列表中。
例如这里的输出将是 3.txt 和 4.txt。我已通过 foreach
语句完成此操作。但现在我想通过使用 LINQ(C#) 来做同样的事情。
编辑:
我的代码是
List<FileList> sourceFileNames = new List<FileList>();
sourceFileNames.Add(new FileList { FileNames = "1.txt" });
sourceFileNames.Add(new FileList { FileNames = "2.txt" });
sourceFileNames.Add(new FileList { FileNames = "3.txt" });
sourceFileNames.Add(new FileList { FileNames = "4.txt" });
List<FileList> destinationFileNames = new List<FileList>();
destinationFileNames.Add(new FileList { FileNames = "1.txt" });
destinationFileNames.Add(new FileList { FileNames = "2.txt" });
IEnumerable<FileList> except = sourceFileNames.Except(destinationFileNames);
Filelist
是一个简单的类,只有一个字符串类型的属性 fileNames。
class FileList
{
public string FileNames { get; set; }
}
最佳答案
这就是 Except
用于:
var files = sourceFilenameList.Except(destinationList);
请注意,这是一个集合操作,因此如果源列表有重复的条目,您只会看到唯一的结果:new[] {a, a, b, b, c}.Except(new[] {b, c})
只是{a}
, 不是 {a, a}
.
与许多 LINQ 运算符一样,这将返回 IEnumerable<T>
- 如果你想要它作为 List
返回只需调用 ToList
:
var files = sourceFilenameList.Except(destinationList).ToList();
编辑:好的,现在您已经展示了 FileList
的内容是的,问题很简单,就是你没有实现相等比较。您可以通过覆盖 Equals
来做到这一点和 GetHashCode
(可能还有 IEquatable<FileList>
)或通过实现 IEqualityComparer<T>
.但是,您仍然遇到问题:FileNames
是一种可变类型,而那些在散列和相等性方面通常效果不佳。两个实例最初可能相等,然后其中一个可能会发生变化。我建议将其重新实现为不可变类型。像这样:
public sealed class FileList : IEquatable<FileList>
{
private readonly string fileNames;
public string FileNames { get { return fileNames; } }
public FileList(string fileNames)
{
// If you want to allow a null FileNames, you'll need to change
// the code in a few places
if (fileNames == null)
{
throw new ArgumentNullException("fileNames");
}
this.fileNames = fileNames;
}
public override int GetHashCode()
{
return fileNames.GetHashCode();
}
public override bool Equals(object other)
{
return Equals(other as FileList);
}
public bool Equals(FileList other)
{
return other != null && other.FileNames == FileNames;
}
}
您的示例代码可以变成:
List<FileList> sourceFileNames = new List<FileList>
{
new FileList("1.txt"),
new FileList("2.txt"),
new FileList("3.txt"),
new FileList("4.txt")
};
List<FileList> destinationFileNames = new List<FileList>
{
new FileList("1.txt"),
new FileList("2.txt")
};
IEnumerable<FileList> except = sourceFileNames.Except(destinationFileNames);
关于c# - Where Not In OR Except 在 LINQ to Objects 中模拟 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2644139/
我是一名优秀的程序员,十分优秀!