LINQ检查类是否在列表中

时间:2016-01-25 10:59:53

标签: c# json linq

我有一种情况,如果它们不存在,我必须处理在列表中添加自定义对象的情况。到目前为止,我没有运气。

我有一个名为ImagePoint的自定义类:

public class ImagePoint
{
    public List<string> Point { get; set; }
    public List<string> NameSize { get; set; }

    public ImagePoint(List<string> _Point, List<string> _NameSize)
    {
        Point = _Point;
        NameSize = _NameSize;
    }
}

我目前正在使用JSON.NET来保存和加载我的ImagePoint对象。 JSON使用如下输出保存文件:

[
  {
    "Point": [
      "16 11"
    ],
    "NameSize": [
      "Preview Buttons",
      "27 11"
    ]
  },
  {
    "Point": [
      "16 0"
    ],
    "NameSize": [
      "Close Buttons",
      "27 11"
    ]
  }
]

我读取文件并将内容加载到我的`imagePointsList&#39;:

List<ImagePoint> imagePoint = JsonConvert.DeserializeObject<List<ImagePoint>>(sr.ReadToEnd());
foreach (var item in imagePoint)
{
    imagePointsList.Add(item);
}

现在,在我想添加之前,我首先创建一个新的ImagePoint对象,然后像这样分配值:

string[] p, s;
ImagePoint image_point = new ImagePoint(new List<string>(), new List<string>());
image_point.NameSize.Add(tb_point_name.Text);

if (tb_position.Text.Contains(",")) //More than one Point
{
    p = tb_position.Text.Split(',');
    image_point.Point.AddRange(p);
}
else // One Point
{
    p = new string[1];
    p[0] = tb_position.Text;
    image_point.Point.AddRange(p);
}

if (tb_width_height.Text.Contains(",")) //More than one Size
{
    s = tb_width_height.Text.Split(',');
    image_point.NameSize.AddRange(s);
}
else // One Size
{
    s = new string[1];
    s[0] = tb_width_height.Text;
    image_point.NameSize.AddRange(s);
}

然后我使用以下方法检查内容是否相同:

bool contains = imagePointsList.Any(item => item.Point.ToArray() == p);

问题是即使我加载json文件并且我知道列表中存在这些点(请参阅json输出),我仍然从contains变量得到一个False值。

如何有效地检查列表是否已经包含值为p的项目,如果有,则contains应返回True否则为假。

2 个答案:

答案 0 :(得分:1)

==比较数组的引用而不是其内容,请尝试item.Point.SequenceEqual(p)

bool contains = imagePointsList.Any(item => item.Point.SequenceEqual(p));

答案 1 :(得分:1)

contains变量永远不会成立,因为当您编写item.Point.ToArray() .Net创建一个新数组,然后进行比较。但是数组没有重载等于运算符,因此它们将通过引用进行比较。因为ToArray()刚刚创建了一个新数组,所以它永远不会发生。您可以使用LINQ命名空间中的SequenceEqual或编写自己的比较器。并且谨慎对待ToArray()次调用,因为它会给GC带来很大的压力。