【问题标题】:C# Object modelling 1:n:m... realtionshipsC# 对象建模 1:n:n... 关系
【发布时间】:2019-12-25 04:33:17
【问题描述】:

如何创建具有多个相关属性的属性的对象,这些属性具有多个相关属性等等?

我正在创建一个 C# 类,用于描述各种老虎群的脚趾疾病。

一个殖民地有很多老虎。 1只老虎有4只爪子。 1只爪子有5个脚趾。每个脚趾都“感染”或“未感染”。

我如何构造一个对象来检索名为 Eddy 的右前爪的第二个脚趾的第 4 殖民地老虎的患病状态?例如

 Tiger t = new Tiger;

 string toeStatus = t.colony(4).tiger("Eddy").paw("front-right").toe(2)

我只是每个人都必须创建具有自身属性的对象,而不是具有与与属性相关的属性相关的属性。

我还想重新使用这个对象来获取给定殖民地的所有老虎的名字...

string allTigersNames = t.colony(4).tiger(*)
//Eddy, Glennis, Barry, Toby, Punter

我曾在类似的similar post 中提出过问题,但得到的答复是我目前的经验水平无法理解的。特别是使用强类型属性的方法。

【问题讨论】:

  • 你最好从强类型模型开始。那么它就像使用 linq 来查询它一样简单......也许在这个阶段你需要粘贴 Tiger 的代码(这......请注意,在概念上并没有感觉)。 tiger 怎么会有 subtigers
  • 谢谢我的问题是我不明白“强类型模型”是什么意思。我的搜索返回对“强类型视图”的引用以及有关 C# 如何成为强类型语言的文章。
  • 我们需要看到Tiger的代码才能知道你在哪里

标签: c# object data-modeling


【解决方案1】:
public class Colony
{
    public int ColonyId {get; set;}
    public string ColonyName {get; set;}
    public List<Tiger> Tigers {get; set;}
}

public class Tiger
{
    public int TigerId {get; set;}
    public string TigerName {get; set;}
    public Colony Colony {get; set;}
    public List<Paw> Paws {get; set;}
}

public class Paw
{
    public int PawId {get; set;}
    public string PawDescription {get; set;}
    public Tiger Tiger {get; set;}
    public List<Toe> Toes {get; set;}
}

public class Toe
{
    public int ToeId {get; set;}
    public Paw Paw {get; set;}
    public int ToeFinger {get; set;}
}

如果你问我,这将是我的层次结构

Colony > Multiple Tigers
Tiger > Multiple Paws
Paw > Multiple Toes

然后添加看起来像这些


var primaryColony = new Colony
{
    ColonyId = 1,
    ColonyName = "First Colony",
    Tigers = new List<Tigers>();
};

var colonies = new List<Colonies>();


//adding primary colony
colonies.Add(primaryColony);

//adding tiger to primary colony via name or you could use ColonyId == 1
colonies.First(c => c.ColonyName == "First Colony")
.Tigers.Add(new Tiger
{
    TigerId = 1,
    TigerName = "Eddy",
    Paws = new List<Paw>();,
    Colony = primaryColony
});

//adding paws to tiger named eddy in colony named primary colony
colonies.First(e => e.ColonyName == "First Colony")
.Tigers.First(r => r.TigerName == "Eddy")
.Paws.Add(new Paw
{
    PawId = 1,
    PawDescription = "right-front",
    Toes = new List<Toes>();,
    Tiger = colonies.First(e => e.ColonyName == "First Colony")
.Tigers.First(r => r.TigerName == "Eddy")
});

//adding toes to right front paw of tiger named eddy in colony named first colony
colonies.First(e => e.ColonyName == "First Colony")
.Tigers.First(r => r.TigerName == "Eddy")
.Paws.First(q => q.PawDescription == "right-front")
.First().Toes.Add(new Toe
{
    ToeId = 1,
    ToeFinger = 1,
    Paw = colonies.First(e => e.ColonyName == "First Colony")
.Tigers.First(r => r.TigerName == "Eddy")
.Paws.First(q => q.PawDescription == "right-front")
});

或者如果你有一个过滤器,比如你希望爪子添加到 TigerName = Eddy

var tigerEddy = colonies.Select(y => new Tiger
{
    TigerId = y.Tigers.FirstOrDefault?.(c => c.TigerName == "Eddy").Select(e => e.TigerId),
    TigerName = y.Tigers.FirstOrDefault?.(c => c.TigerName == "Eddy").Select(e => e.TigerName),
    Colony = y.Tigers.FirstOrDefault?.(c => c.TigerName == "Eddy").Select(e => e.Colony)
    Paws = y.Tigers.FirstOrDefault?.(c => c.TigerName == "Eddy").Select(e => e.Paws)
}.Any(x => x.Tigers.Containes("Eddy").FirstOrDefault();

tigerEddy.Paws.Add(new Paws.....);

然后以TigerId为参考将其传回殖民地

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-26
    • 1970-01-01
    • 2019-04-30
    • 1970-01-01
    相关资源
    最近更新 更多