【问题标题】:Pre-initialization object in a List<object>List<object> 中的预初始化对象
【发布时间】:2014-03-03 13:04:51
【问题描述】:

我想问你这个困扰我很久的问题

我有一个类似的列表

 List<ViewModel> listVoie = new List<ViewModel>();

在这个列表中,对象“ViewModel”是一种画线功能,每次我需要给它两点4示例

 Dictionary<int, double> pointAdd= new Dictionary<int, double>();     
 pointAdd.Add(listPoint1[i], 0);
 pointAdd.Add(listPoint2[i], -500);

如您所见,我还有另外两个列表要存储 int

List<int> listPoint1 = new List<int>; List<int> listPoint2 = new List<int>;

这两个列表的长度相等,但实际值不确定; 我需要将每一行定义为一个新对象“ViewModel”我该怎么做?从现在开始,我有这个我的想法;但它不能工作,因为 ViewModel v 将返回 NullReferenceException

List<ViewModel> listVoie = new List<ViewModel>(new ViewModel[listPoint1.Count]);
foreach (ViewModel v in listVoie)
{
    Dictionary<int, double> pointAdd= new Dictionary<int, double>();
    for (int i = 0; i < listPoint1.Count; i++)
    {
        pointAdd.Add(listPoint1[i], 0);
        pointAdd.Add(listPoint2[i], -500);
        v.point= pointAdd;
        ....
        i++;
    }

有人可以帮我解决这个问题吗?请原谅我的愚蠢问题打扰你......谢谢

两个列表 listPoint1 和 listPoint2 不为空;他们从其他方法加载一些值。

【问题讨论】:

  • listPoint1 和 listPoint2 中的一些值在哪里添加?
  • listPoint1listPoint2 在您的代码中均为空
  • 在其他方法中,它将通过使用 breakPoint 返回 listPoint1 和 listPoint2 中的值列表;我可以看到它确实在那里传递了价值;
  • 看看这篇文章,它不是你问题的答案,但它是相关的,但我觉得很有趣:stackoverflow.com/questions/1256793/mvvm-sync-collections
  • @FANWicked 你能指定你的目标吗?您想创建Dictionary&lt;int, double&gt;,它将包含两个列表中的所有项目?那你为什么有listVoie

标签: c# linq


【解决方案1】:

下面一行:

List<ViewModel> listVoie = new List<ViewModel>(new ViewModel[listPoint1.Count]);

实际上创建了一个空列表。您拥有的参数并不表示您用 N 个对象填充列表,它只是出于性能目的(List&lt;T&gt; 的内部实现:初始化将包含您的列表项的数组)大小)。

你应该做的是:

// Empty list for now
List<ViewModel> listVoie = new List<ViewModel>();

foreach (int j = 0; j < listPoint1.Count; j++)
{
    // Creates the ViewModel here, and adds it to the list
    var myViewModel = new myViewModel();
    listVoie.Add(myViewModel);

    Dictionary<int, double> pointAdd= new Dictionary<int, double>();
    for (int i = 0; i < listPoint1.Count; i++)
    {
        pointAdd.Add(listPoint1[i], 0);
        pointAdd.Add(listPoint2[i], -500);
        myViewModel.point= pointAdd;
        ....
        i++;
    }

对于您拥有的其他列表也是如此。

【讨论】:

  • 谢谢!真的很有帮助
【解决方案2】:

事实上,我想为每个ViewModel 返回一个List&lt;ViewModel&gt; 有自己的两个值,一个来自listPoint1,一个来自listPoint2

您可以简单地Zip 两个序列:

List<ViewModel> listVoie = 
    listPoint1.Zip(listPoint2, (p1,p2) => new ViewModel {
          // use p1 and p2
    }).ToList();

【讨论】:

    【解决方案3】:

    您可以按如下方式定义您的 ViewModel:

    public class ViewModel
    {
        public Dictionary<int, double> point;
    
        public void SetPoints(List<int> list1, List<int> list2)
        {
            point = new Dictionary<int, double>();
            for (int i = 0; i < list1.Count; i++)
            {
                point.Add(list1[i], 0);
                point.Add(list2[i], -500);
                i++;
            }
        }
    }
    

    为 List 创建一个新类,如下所示:

    public class ViewModelList : List<ViewModel>
    {
        public void UpdateAllPoints(List<int> list1, List<int> list2)
        {
            this.Clear();
            foreach (var item in list1)
            {
                var viewModel = new ViewModel();
                viewModel.SetPoints(list1, list2);
                this.Add(viewModel);
            }
        }
    }
    

    并将其用作:

            var listVoie = new ViewModelList();
            listVoie.UpdateAllPoints(listPoint1, listPoint2);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-11
      • 1970-01-01
      • 2021-09-28
      • 2012-11-03
      • 2013-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多