Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#将两个属性合并到一个列表中并过滤唯一值_C#_Algorithm_Linq_Data Structures - Fatal编程技术网

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