gpt4 book ai didi

c# - Where Not In OR Except 在 LINQ to Objects 中模拟 SQL

转载 作者:行者123 更新时间:2023-11-30 13:07:51 26 4
gpt4 key购买 nike

假设我有两个列表,分别包含源文件名和目标文件名列表。

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com