我有一种情况,如果它们不存在,我必须处理在列表中添加自定义对象的情况。到目前为止,我没有运气。
我有一个名为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否则为假。
答案 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带来很大的压力。