3

我有一个类对象列表UserDatawhere我通过方法从这个列表中得到一个对象

UserData.Where(s => s.ID == IDKey).ToList(); //ID is unique

我想对对象进行一些更改并插入到列表中的相同位置。但是,我没有这个对象的索引。

知道怎么做吗?

谢谢

4

5 回答 5

7

UserData.FindIndex(s => s.ID == IDKey) 您可以使用它将返回一个 int的方法获取索引 。

于 2013-02-06T12:44:23.807 回答
6

当您从 LIST 获取项目时,它是一个引用类型,如果您对其进行任何更新,那么它将自动更改 LIST 中的值。更新后请自行检查............

项目,无论你从哪里得到

UserData.Where(s => s.ID == IDKey).ToList(); 

是引用类型。

于 2013-02-06T12:45:21.403 回答
2

只要UserData是引用类型,列表就只保存对该对象实例的引用。因此,您无需删除/插入即可更改其属性(显然不需要该对象的索引)。

我还建议您使用Singlemethod (而不是ToList()),只要 id 是唯一的。

例子

public void ChangeUserName(List<UserData> users, int userId, string newName)
{
     var user = users.Single(x=> x.UserId == userId);
     user.Name = newName;  // here you are changing the Name value of UserData objects, which is still part of the list
}
于 2013-02-06T12:57:37.607 回答
1

只需使用获取对象SingleOrDefault并进行相关更改;您无需再次将其添加到列表中;您只是在更改作为列表元素的相同实例。

var temp = UserData.SingleOrDefault(s => s.ID == IDKey);
// apply changes
temp.X = someValue;
于 2013-02-06T12:53:12.547 回答
0

如果我误解了你,请纠正我,但我认为你是说你本质上想要遍历列表的元素,如果它匹配一个条件,那么你想以某种方式改变它并将它添加到另一个清单。

如果是这种情况,请查看下面的代码,了解如何使用 Where 子句编写匿名方法。Where 子句只需要一个匹配以下内容的匿名函数或委托:

参数:ElementType 元素,int 索引——返回:bool 结果

这允许它根据布尔返回选择或忽略元素。这允许我们提交一个简单的布尔表达式,或更复杂的函数,它有额外的步骤,如下所示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace StackOverflow
{
    class Program
    {
        static void Main(string[] args)
        {
            int IDKey = 1;
            List<SomeClass> UserData = new List<SomeClass>()
            {
                new SomeClass(),
                new SomeClass(1),
                new SomeClass(2)
            };
            //This operation actually works by evaluating the condition provided and adding the
            //object s if the bool returned is true, but we can do other things too
            UserData.Where(s => s.ID == IDKey).ToList();
            //We can actually write an entire method inside the Where clause, like so:
            List<SomeClass> filteredList = UserData.Where((s) => //Create a parameter for the func<SomeClass,bool> by using (varName)
                {
                    bool theBooleanThatActuallyGetsReturnedInTheAboveVersion =
                        (s.ID == IDKey);
                    if (theBooleanThatActuallyGetsReturnedInTheAboveVersion) s.name = "Changed";
                    return theBooleanThatActuallyGetsReturnedInTheAboveVersion;
                }
            ).ToList();

            foreach (SomeClass item in filteredList)
            {
                Console.WriteLine(item.name);
            }
        }
    }
    class SomeClass
    {
        public int ID { get; set; }
        public string name { get; set; }
        public SomeClass(int id = 0, string name = "defaultName")
        {
            this.ID = id;
            this.name = name;
        }
    }
}
于 2013-02-06T13:05:03.250 回答