【问题标题】:Efficiently adding info to a list. Linq Union?有效地将信息添加到列表中。林克联盟?
【发布时间】:2014-08-31 12:03:19
【问题描述】:

我有一些从数据库中查询的数据,但如果没有特定财政年度的记录,它不会在我的列表中返回。我需要返回所有财务年度,但实际信息(GrossEx、GST、GrossInc)都应该为空。

public class FinancialData
{
    public string FinancialYear { get; set; }
    public string Type { get; set; }
    public decimal? GrossEx { get; set; }
    public decimal? GST { get; set; }
    public decimal? GrossInc { get; set; }
}

我如何有效地将 2004 年到 2015 年的 FinancialYears(Gross、GST 和 GrossInc 为空)添加到我的列表中(如果它们不存在)?

List<FinancialData> financialDataBucket = new List<FinancialData>();

FinancialData entry1 = new FinancialData { FinancialYear = "2012 - 2013", GrossEx = 1, GrossInc = 1, GST = 1 };
FinancialData entry2 = new FinancialData { FinancialYear = "2013 - 2014", GrossEx = 1, GrossInc = 1, GST = 1 };

financialDataBucket.Add(entry1);
financialDataBucket.Add(entry2);

我尝试使用 linq 比较器进行联合,但由于某种原因它不起作用,我不知道为什么?这是解决我的问题的最佳方法吗?

var merged = allFinancialYearsData.Union(financialDataBucket, new EqComparer());

public class EqComparer : IEqualityComparer<FinancialData>
{
    public bool Equals( FinancialData x, FinancialData y )
    {
        return x.FinancialYear == y.FinancialYear;
    }

    public int GetHashCode( FinancialData obj )
    {
        return obj.GetHashCode ();
    }
}

编辑:

所以,我正在考虑创建 10 个不同的财政年度对象并将它们添加到列表中,或者

var currentYear = DateTime.Now.Year + (DateTime.Now.Month < 7 ? 0 : 1);
var earliestYear = 2005;

for (int i = earliestYear; i <= currentYear; i++) {
    //Instantiate FinancialData here.....
   financialDataItem.FinancialYear = (i-1) + " - " + i
}

谢谢!

【问题讨论】:

  • 嗯... GetHashCode 实现中的“faewfeawfewa”是什么?无论如何,返回 obj.GetHashCode 意味着您正在比较对象引用而不是值...
  • 向我们展示您如何创建 allFinancialYearsData。
  • fawefeawfewa 可能意味着 FinancialData

标签: c# performance linq comparator


【解决方案1】:

您必须执行组加入。在下面的代码 sn-p 中,allRecords 为“2005 - 2006”到“2014 - 2015”创建虚拟 FinancialData。

var allRecords = Enumerable.Range(0, 10).Select(x => new FinancialData { FinancialYear = string.Format("{0} - {1}", 2005 + x, 2005 + x + 1) });
var myRecords = new[] { new FinancialData { FinancialYear = "2012 - 2013", GrossEx = 1, GrossInc = 1, GST = 1 }, new FinancialData { FinancialYear = "2013 - 2014", GrossEx = 1, GrossInc = 1, GST = 1 } };
var result = allRecords.GroupJoin(myRecords
                , x => x.FinancialYear, y => y.FinancialYear, (x, y) => y.FirstOrDefault(u => u.FinancialYear == x.FinancialYear) ?? x);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-18
    • 2015-08-18
    • 2017-03-16
    • 2013-03-06
    • 1970-01-01
    • 2021-11-14
    • 2019-03-02
    相关资源
    最近更新 更多