我对Linq查询非常了解。我在csv中有一组记录,如下所示
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-jdbc -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<version>1.5.2.RELEASE</version>
</dependency>
我需要检查每个产品的名称,如果它在所有记录中不相同,那么我需要发送一条错误消息。我知道下面的查询用于查找记录中的重复项但不是确定如何修改它,检查它是否具有相同的值。
ProdID,Name,Color,Availability
P01,Product1,Red,Yes
P02,Product2,Blue,Yes
P03,Product1,Yellow,No
P01,Product1,Red,Yes
P04,Product1,Black,Yes
答案 0 :(得分:2)
var first = myObjects.First();
bool allSame = myObjects.All(x=>x.Name == first.Name);
如果lambda为集合的所有元素返回true,则Enumerable.All()将返回true。在这种情况下,我们检查每个对象的Name属性是否等于第一个(因此它们彼此都相等;传递属性很好,不是吗?)。您可以通过内联myObjects.First()来对此进行单行处理,但这会降低性能,因为First()将对集合中的每个对象执行一次。理论上你也可以跳过()第一个元素,因为我们知道它等于它自己。
答案 1 :(得分:0)
作者评论后的UPD:
要知道与第一条记录名称不同的所有记录:
var firstName = ProductsList[0].Name;
var differentNames = ProductsList.Where(p => p.Name != firstName);
另一个选项(仅包含所有其他名称):ProductsList.Select(p => p.Name).Where(n => n != firstName).Distinct()
旧版
那么,如果至少有两个不同的名称,那么你应该返回错误吗?
LINQ方式:return ProductsList.Select(p => p.Name).Distinct().Count() <= 1
更优化的方式:
if (ProductsList.Count == 0)
return true;
var name = ProductsList[0].Name;
for (var i = 1; i < ProductsList.Count; i++)
{
if (ProductsList[i].Name != name)
return false;
}
return true;
答案 2 :(得分:0)
如果我理解正确,您想检查列表中是否存在产品
using System.Linq;
private bool ItemExists(string nameOfProduct) {
return ProductsList.Any(p=> p.Name== nameOfProduct);
}