C#将两个属性合并到一个列表中并过滤唯一值
为了解释我的问题,我用一个C#将两个属性合并到一个列表中并过滤唯一值,c#,algorithm,linq,data-structures,C#,Algorithm,Linq,Data Structures,为了解释我的问题,我用一个图书包创建了这个简化示例,其中包含两本图书: public class BookBundle { public Book Book1 { get; } public Book Book2 { get; } } 但是现在我有很多书包s,但我不知道我的图书馆里有哪本独特的书。为此,我创建了一个函数: public static Book[] GetUniqueBooks(BookBundle[] bundles) { // Return all u
图书包创建了这个简化示例,其中包含两本图书
:
public class BookBundle
{
public Book Book1 { get; }
public Book Book2 { get; }
}
但是现在我有很多书包
s,但我不知道我的图书馆里有哪本独特的书。为此,我创建了一个函数:
public static Book[] GetUniqueBooks(BookBundle[] bundles)
{
// Return all unique books
}
实现此功能最有效的方法是什么?是否有一些Linq函数我可以使用,或者我应该使用列表
或字典
来跟踪我在循环中找到的唯一项?哪个最快(算法复杂度最低)?您可以使用从System.Linq
中选择many
bundles.SelectMany(b => new Book[] {b.Book1, b.Book2}).Distinct();
这是一个简单的实现,可以解决您的问题,如果您创建同一本书的两个不同实例,也可以使用它
public Book[] GetUniqueBooks(BookBundle[] bundles)
{
Dictionary<string, Book> dict = new Dictionary<string, Book>();
foreach (BookBundle b in bundles)
{
Book bk;
if(!dict.TryGetValue(b.Book1.ISBN, out bk))
dict.Add(b.Book1.ISBN, b.Book1);
if (!dict.TryGetValue(b.Book2.ISBN, out bk))
dict.Add(b.Book2.ISBN, b.Book2);
}
return dict.Values.ToArray();
}
public Book[]GetUniqueBooks(BookBundle[]bundles)
{
Dictionary dict=新字典();
foreach(一捆捆中的b捆书)
{
书籍bk;
如果(!dict.TryGetValue(b.Book1.ISBN,out bk))
dict.Add(b.Book1.ISBN,b.Book1);
如果(!dict.TryGetValue(b.Book2.ISBN,out bk))
dict.Add(b.Book2.ISBN,b.Book2);
}
返回dict.Values.ToArray();
}
当然,这假设您已经在类中定义了唯一标识书籍的属性。在本例中,我使用了国际标准书号作为字典中的关键字您如何知道您有一个唯一的捆绑包?如果一个包中的一本书是唯一的,而另一本不是唯一的呢?请解释更多关于这一切的内容……你可以将你的uniqhe图书存储在一本字典中,其中的键设置为图书的ISBN代码和图书的价值object@rory.ap一个捆绑包总是唯一的,因为它永远不会包含与另一个捆绑包相同的两本书。但是一本书可以分成多个包。你有多少本书?他们的平等性是什么?@eocron这必须适用于任何数量的书籍,假设有一千本。为了进行比较,可以使用ID
/ISBN
属性或=
属性。我不明白这是如何工作的。对于每一捆书,我们将得到一组两本书。对的所以5个bundle将产生5个数组中的1个数组,每个数组包含两本书。。。但是我们想要一个10本书的平面阵列。(假设不同等)不,这不是SelectMany
的工作方式。阅读文档,它获取一个IEnumerable
的IEnumerable
,并将它们的组合内容展平为一个IEnumerable
。