system.collection.generic.list system.string返回而不是实际数据

时间:2016-01-21 19:00:13

标签: c# linq

我有一个linq表达式,用于返回CSV文件中的字符串列表。问题是它返回System.Collections.Generic.List'1[System.String],其中应该有每个人的数据。

这是表达式

  foreach (Person person in persons)
            {
                var finalValue = person.PersonDatas.Where(x => x.FinalValue != null).ToString();

                sb.AppendLine(string.Format("\"{0}\",\"{1}\",\"{2}\"",
                    person.ClientInternalPerson_ID,
                    person.FirstName + " " + person.LastName,
                    finalValue
                                           ));
            }

我也试过

var finalValue = person.PersonDatas.Where(x => x.FinalValue != null).ToString();

但所有返回的是

System.Linq.Enumerable+WhereListIterator'1[Project.Core.Models.PersonData]

2 个答案:

答案 0 :(得分:1)

您无法在查询中调用.ToString,因为它会返回一个记录集(实际上是IEnumerable<PersonData>),而不是单个值。然后,您需要像这样迭代它们:

foreach (Person person in persons)
{
  var finalValues = person.PersonDatas.Where(x => x.FinalValue != null);
  foreach(var finalValue in finalValues)
  {
    sb.AppendLine(string.Format("\"{0}\",\"{1}\",\"{2}\"",
      person.ClientInternalPerson_ID,
      person.FirstName + " " + person.LastName,
      finalValue));
  }
}

您可以使用SelectMany进一步扁平化,但这是一个不同的问题。如果您期望FinalValue!= null的每个人只有1条且只有1条记录,那么您可以使用.First.Single来简化它:

foreach (Person person in persons)
{
  var finalValue = person.PersonDatas.First(x => x.FinalValue != null);

  sb.AppendLine(string.Format("\"{0}\",\"{1}\",\"{2}\"",
    person.ClientInternalPerson_ID,
    person.FirstName + " " + person.LastName,
    finalValue));
}

答案 1 :(得分:0)

以下命令返回一个可枚举列表,其中包含具有非null FinalValues的PersonData对象:

 var finalValue = person.PersonDatas.Where(x => x.FinalValue != null).First().FinalValue.ToString();

您需要从列表中获取特定的PersonData对象。例如,下面将为您提供第一个具有非null FinalValue的PersonData对象的FinalValue。

var finalValuePerson = person.PersonDatas.Where(x => x.FinalValue != null).FirstOrDefault();
var finalValue = (finalValuePerson != null) ? finalValuePerson.FinalValue : "";

注意 - 如果没有匹配,上面的代码会抛出异常。如果您没有这方面的保证,您可以执行以下操作:

 app.filter('amCalendarDate', function($translate) {
    return function(dt) {
        var md = moment(dt), key = '';

        if (!dt || !md || (md + '').toLowerCase() == 'invalid date')
            return '';

        var today = moment();
        var diff = today.diff(md, 'days');

        if (!diff)
            key = 'Today';
        else if (diff == -1)
            key = 'Tomorrow';
        else if (diff == 1)
            key = 'Yesterday';
        else if (Math.abs(diff) <= 6) {
            if (diff < 0)
                key = 'Next';
            else
                key = 'Last';

            var days = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_');

            today.day(diff);

            key += ' ' + days[today.day()];
        }

        if (key) {
            // if you don't have translate, just return the key
            return $translate.amCalendarDate[key];
        } else
            return md.format('L');
    }
});