对层次结构相似的结构进行验证

时间:2014-10-28 09:30:41

标签: c# linq hierarchy

假设有一个DataTable,如下所示:

enter image description here

每一行都是(N1,N2,N3,N4)的组合,具有这种约束:

  • 只有N1,N2,N3和N4可以为空白
  • 在每一行中,只有当N(n-1)为NULL时,N(n)才能为NULL。(类似于分层结构)。
  • (N1,N2,N3,N4)的每个组合在整个集合中是唯一的。

我正在寻找一套解决方案,对于整套来说,"没有任何组合必须有一个值,其数量列小于其子组合的总和&#34 ;;。

例如,行的数量:1必须大于行的总和:2,10,11,因此行的数量:2必须大于行的总和:3,4,5,6,7,8, 9(在特定情况下哪一个当然无效)。

我的开发环境是C#.net,首选使用Linq。

提前致谢

1 个答案:

答案 0 :(得分:0)

您可以将一个方法放在一起,该方法决定两个Tuple<N1,N2,N3,N4>类似对象的父子关系。想法:位数组表示和移位。有了这个天真的模型:

public class Budget
{
public int Id { get; set; }
//
public int N1 { get; set; }
public Nullable<int> N2 { get; set; }
public Nullable<int> N3 { get; set; }
public Nullable<int> N4 { get; set; }
//
public float Amount { get; set; }
/// <summary>
/// Method analyzes if current object is a parent of <paramref name="other"/>
/// if you override GetHashCode or provide a nifty bit array representation 
/// you can infer parent-child relationships with really fast bit shifting 
/// </summary>
/// <param name="other">budget to compare with</param>    
public bool IsParentOf (Budget other)
{
  // ommitted for too-time-consuming and 'your work obviously' 
  // or 'not-the-purpose-of-this-site'reasons
  return true;
}
}

您可以尝试为每个预算条目获取子组合(此处为您的分类):

  Budget b1 = new Budget() { N1 = 1, N2 = null, N3 = null, N4 = null, Amount = 1200f };
  Budget b11 = new Budget() { N1 = 1, N2 = 1, N3 = null, N4 = null, Amount = 800f };
  Budget b111 = new Budget() { N1 = 1, N2 = 1, N3 = 1, N4 = null, Amount = 800f };
  Debug.Assert (b1.IsParentOf(b11));
  Debug.Assert(b1.IsParentOf(b111));
  Debug.Assert(b11.IsParentOf(b111));
  var budgetEntries = new List<Budget>() { b11, b111 };
  var subCombinations = budgetEntries.Where(be => b1.IsParentOf(be));
  Debug.Assert(b1.Amount > subCombinations.Sum(sc => sc.Amount));

当然,对于整个预算条目数据集,您必须将每个条目与所有其他条目(如笛卡尔积)匹配。我并不认为这很快,但绝对应该做到这一点。