Linq查询以检查记录是否完​​全相同

时间:2017-03-16 14:55:13

标签: c# linq

我对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

3 个答案:

答案 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);
}