【问题标题】:List Iteration to Create Custom List in C#(Linq)列表迭代以在 C#(Linq) 中创建自定义列表
【发布时间】:2018-05-29 10:26:45
【问题描述】:

我有一个列表,我必须从列表中创建具有自定义属性的新列表,这些属性添加到 HistoryItem2 类中。在 HistoryItem2 类中,Level 属性是我想根据其循环索引添加 int 值。

HistoryItem.cs

public class HistoryItem
    {
        public string HistoryName { get; set; }

        public List<HistoryItem> HistoryCollection { get; set; }

        public HistoryItem()
        {
            HistoryCollection = new List<HistoryItem>();
        }
    }

HistoryItem2.cs

public class HistoryItem2
    {
        public List<HistoryItem> historyItems { get; set; }
        public int Level { get; set; }
        public bool flag {get; set;}

        public HistoryItem2() {
            historyItems = new List<HistoryItem>();
        }

        public HistoryItem2(List<HistoryItem> historyItems, int level, bool flag)
        {
            this.historyItems = historyItems;
            this.Level = level;
            this.flag = flag;
        }
    }

我尝试了很多东西,但没有什么对我有用。

编辑:

如此屏幕截图所示:

我想根据它在 List 中设置 Level。

Exmp : 如果 List inside List inside List than and than 它的级别是2

我们将不胜感激。

【问题讨论】:

  • 您的意思是要将HistoryItem 类型的旧项目复制到HistoryItem2 类型的新项目中,并将新项目的Level 设置为它们在旧列表中的索引?那么flag 呢?
  • @RenéVogt 是的,没错,所有flag 都是false 的首字母。
  • 请澄清您的问题。
  • HistoryItem2 应该有一个 HistoryItem2 不是 HistoryItem 的列表,对吗?或者你将如何设置 level > 0
  • HistoryItem2 我有HistoryItem 的列表,在HistoryItem2 中我必须设置levelflag

标签: c# list linq foreach


【解决方案1】:

我认为您正在寻找的是一个多级列表。

因此,您不需要 2 个不同的类,一个就足够了。这里有一个可以帮助您入门。

public class HistoryItem
{
    public HistoryItem this[int i]
    {
        get => Children[i];
        set => Children[i] = value;
    }

    public string Name { get; set; }
    public int Level { get; private set; }

    private HistoryItem _parent;
    public HistoryItem Parent {
        get => _parent;
        set
        {
            if (value == null)
            {
                Level = 0;
                _parent = null;
            }
            else
            {
                Level = value.Level + 1;
                _parent = value;
            }
        }
    }

    public IList<HistoryItem> Children { get; set; }

    public HistoryItem()
    {
        Name = "Parent";
        Level = 0;
        Parent = null;
        Children = new List<HistoryItem>();
    }

    public HistoryItem(string name)
    {
        Name = name;
        Level = 0;
        Parent = null;
        Children = new List<HistoryItem>();
    }

    public HistoryItem(HistoryItem parent)
    {
        Name = "Child";
        Level = parent.Level + 1;
        Parent = parent;
        Children = new List<HistoryItem>();
    }

    public HistoryItem(string name, HistoryItem parent)
    {
        Name = name;
        Level = parent.Level + 1;
        Parent = parent;
        Children = new List<HistoryItem>();
    }

    public void AddChild()
    {
        Children.Add(new HistoryItem("Child", this));
    }

    public void AddChild(string name)
    {
        Children.Add(new HistoryItem(name, this));
    }

    #region Overrides of Object

    public override string ToString()
    {
        return $"{Name} : Level: {Level}";
    }

    #endregion
}

使用这个类非常简单。您可以像这样创建父类:

var parent1 = new HistoryItem("Parent One");

并以两种方式添加孩子,但首选和推荐第二种方式。

parent1.Children.Add(new HistoryItem("Child 1", parent1));
parent1.AddChild("Child 2");

添加子孩子可以这样完成:

parent1[0].AddChild("Sub-Child 1");
parent1[0].AddChild("Sub-Child 2");

并且更改子子项的父项(如果您将其设置为 null,也可以使其成为顶级项)可以这样完成:

parent1[0][0].Parent = parent1;

这会将 subchild1 的父级从 child1 更改为父级,进而将其级别从 2 更改为 1。

这是一个 dotnet fiddle,可以更好地了解发生了什么:https://dotnetfiddle.net/tIF1Xg

此代码可能不应该用作最终代码。您最好创建自己的集合并使用它,而不是列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-19
    • 1970-01-01
    • 2019-05-19
    • 2013-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多