我有两个数组。

var data1 = new[] {
        new { Product = "Product 1", Year = 2009, Sales = 1212 },
        new { Product = "Product 2", Year = 2009, Sales = 522 },
        new { Product = "Product 1", Year = 2010, Sales = 1337 },
        new { Product = "Product 2", Year = 2011, Sales = 711 },
        new { Product = "Product 2", Year = 2012, Sales = 2245 },
        new { Product = "Product 3", Year = 2012, Sales = 1000 }
    };

var data2 = new[] {
        new { Product = "Product 1", Year = 2009, Sales = 1212 },
        new { Product = "Product 1", Year = 2010, Sales = 1337 },
        new { Product = "Product 2", Year = 2011, Sales = 711 },
        new { Product = "Product 2", Year = 2012, Sales = 2245 }
    };


我想做的是检查Product中每个不同的Yeardata2,如果在Product中是否存在这样的Yeardata1的任何组合的任何行,但在data2中不存在,那么将该行添加到data2

例..
data2中,不同的乘积是Product1Product2,不同的年份是Year1Year2Year3Year4

在data1中,存在一个{ Product = "Product 2", Year = 2009, Sales = 522 }行,而data2中不存在该行,因此我希望将其添加到data2中。

我能做的是得到两个变量的不同产品和年份。

然后对两个循环中的每个循环都执行a,并检查data1中是否存在组合,而data2中不存在,如果存在则将其添加到data2中。

我想得到的是一个LINQ查询,它可以为我完成这项工作,而不是分别执行两个不同的查询,然后为每个循环执行几个查询。

谢谢

最佳答案

您可以在单个查询中使用它。但是,它将是次优的,因为对于data1中的每个项目,您都需要检查三个条件,这可能需要遍历整个data2以获得O(m * n)的时间复杂度(空间复杂度仍然存在) O(1))。

但是,您可以避免相同的循环:

var uniqueProd = new HashSet<string>(data2.Select(d=>d.Product));
var uniqueYear = new HashSet<int>(data2.Select(d=>d.Year));
var knownPairs = new HashSet<Tuple<string,int>>(
    data2.Select(d=>Tuple.Create(d.Product, d.Year))
);
var newData2 = data2.Concat(
    data1.Where(d =>
        uniqueProd.Contains(d.Product)                       // The product is there
    &&  uniqueYear.Contains(d.Year)                          // The year is there
    && !knownPairs.Contains(Tuple.Create(d.Product, d.Year)) // Combination is not there
    )
).ToArray();


该解决方案在时间上为O(m + n),在空间上也为O(n)。

关于c# - 根据条件从一个IEnumerable向另一个IEnumerable添加行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40181410/

10-12 14:16