我有一个:
var list = new List<List<MyClass>>();
MyClass
:
public class MyClass
{
public double X { set; get; }
public double Y { set; get; }
public bool Unique{ set; get; }
}
现在我有一个double x
和double y
,我希望找到包含相同X and Y
的列表元素,并将Unique
字段设置为false。
我已经找到了搜索的例子:
var element = (from sublist in list
from item in sublist
where item.X == x && item.Y == y
select item).FirstOrDefault();
但是如何编辑这个元素?
当然,我可以这样做:
foreach (var myClsList in list)
{
foreach (var myCls in myClsList )
{
if (myCls.X == x && myCls.Y == y)
{
myCls.Unique= false;
}
}
}
但它看起来不太好。
答案 0 :(得分:1)
看起来您确实想要按其X
和Y
属性分组元素,并在这些组中正确设置Unique
属性。以下是一些初步想法:
List<Element> allItems = list.SelectMany(l => l);
var groups = allItems.GroupBy(element => new { X = element.X, Y = element.Y });
foreach (var group in groups) {
bool unique = group.Count() == 1;
foreach (var element in group) {
element.Unique = unique;
}
}
答案 1 :(得分:0)
似乎很不清楚是否要编辑一个元素,或者是否需要编辑符合特定条件的整个元素。
对于您要做的一个元素:
(from sublist in list
from item in sublist
where item.X == x && item.Y == y
select item).First().Unique = false; //the default item will be null
这很有效,但非常难看。更好:
var element = (from sublist in list
from item in sublist
where item.X == x && item.Y == y
select item).FirstOrDefault();
element.Unique = false;
要更改所有内容,请使用foreach
。 Linq不是真正的副作用。它应该是一种副作用结构。在你的情况下,我会这样做:
var query = list.SelectMany(sublist => sublist)
.Where(item => item.X == x && item.Y == y);
foreach(var myClass in query)
myClass.Unique = false;
如果您真的想要副作用,并希望以linq风格进行,您可以更好地采用流畅的风格调整您的MyClass
,如下所示:
public class MyClass
{
public double X { set; get; }
public double Y { set; get; }
public bool Unique { set; get; }
public MyClass Duplicate()
{
Unique = false;
return this;
}
}
// So you call:
var query = list.SelectMany(sublist => sublist)
.Where(item => item.X == x && item.Y == y)
.Select(item => item.Duplicate());
答案 2 :(得分:0)
关于整体结构的一些想法:
查看词典&lt;&gt;类。这旨在存储可以通过任意类型访问的项目列表。要在这种情况下使用它:
Dictionary<MyClass, bool>
(这里似乎需要文字来创建代码块)
public struct MyClass
{
public double X { get; set; }
public double Y { get; set; }
}
var items = new Dictionary<MyClass, Bool>();
items[ new MyClass{ X = 3, Y = 7 } ] = false;
items[ new MyClass{ X = -12, Y = -24 } ] = true;
Assert.IsFalse( items[ new MyClass{ X = 3, Y = 7 } ] );
Assert.IsTrue( items[ new MyClass{ X = -12, Y = -24 } ] );
items[ new MyClass{ X = 3, Y = 7 } ] = true;
Assert.IsTrue( items[ new MyClass{ X = 3, Y = 7 } ] );
阐明字典的工作原理: