我有两个数组。
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
中每个不同的Year
和data2
,如果在Product
中是否存在这样的Year
和data1
的任何组合的任何行,但在data2
中不存在,那么将该行添加到data2
。例..
在
data2
中,不同的乘积是Product1
和Product2
,不同的年份是Year1
,Year2
,Year3
和Year4
。在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/