C# 如何编辑列表列表的元素?

C# 如何编辑列表列表的元素?,c#,linq,list,C#,Linq,List,我有一个: var list = new List<List<MyClass>>(); 现在我有一个double x和double y,我想找到具有相同x和y的列表元素,并将Unique字段设置为false 我已经找到了一些搜索示例,如: var element = (from sublist in list from item in sublist where item.X == x && i

我有一个:

var list = new List<List<MyClass>>();
现在我有一个
double x
double y
,我想找到具有相同
x和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;
    }
  }
}

但是它看起来不太好看。

看起来您真的想按元素的
X
Y
属性对元素进行分组,并在这些组中正确设置
唯一的属性。以下是一些初步想法:

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;
    }
}
List allItems=List.SelectMany(l=>l);
var groups=allItems.GroupBy(element=>new{X=element.X,Y=element.Y});
foreach(组中的var组){
bool unique=group.Count()=1;
foreach(组中的var元素){
元素。唯一=唯一;
}
}

似乎很不清楚是要编辑一个元素,还是要编辑与特定条件匹配的整个元素

对于一个元素,您需要:

(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());

关于总体结构的一些思考:

看字典课。它用于存储可通过任意类型访问的项目列表。要在此上下文中使用它,请执行以下操作:

  • 从类中删除Unique
  • 将类改为结构,以便通过值而不是引用进行比较(即,具有相同X/Y的两个不同MyClass被视为相同)
  • 使用
    字典
(此处似乎需要文本来创建代码块)

公共结构MyClass
{
公共双X{get;set;}
公共双Y{get;set;}
}
var items=newdictionary();
items[newmyclass{X=3,Y=7}]=false;
项[新MyClass{X=-12,Y=-24}]=true;
IsFalse(items[newmyclass{X=3,Y=7}]);
IsTrue(items[newmyclass{X=-12,Y=-24}]);
items[new MyClass{X=3,Y=7}]=true;
IsTrue(items[newmyclass{X=3,Y=7}]);
要阐明字典的工作原理,请执行以下操作:

  • K为“键”型;这是用于标记存储在字典中的项目的类型,在将项目放入字典和取出项目时都会使用
  • V为“值”类型;这是您正在存储的类型
  • 您可以使用索引器阅读或编写词典:
    • var值=字典[键]
    • 字典[键]=值
  • 在某些情况下,Dictionary可能比手动遍历列表更快,因为它在内部可能使用它喜欢搜索匹配项的任何数据结构,这对于大型数据集可能更快。我相信它使用GetHashCode来筛选匹配项,但这在本文中可能并不重要

您通常如何编辑它?看起来很好,还是“很酷”?
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());
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 } ] );