如何在列表中具有不为null的字段中列出元素编号?

时间:2019-09-28 08:04:08

标签: c# linq

我有一个列表,该列表为我提供了短语来源的所有元素,其中MSoftMeaning属性为null或为空:

public class PhraseSource
{
    [PrimaryKey]
    public string Id { get; set; }
    public int PhraseNum { get; set; }
    public string MSoftMeaning { get; set; 
}

public static List<PhraseSource> phraseSources;

var pList = phraseSources.Where(x => string.IsNullOrEmpty(x.MSoftMeaning));

我想做的是代替获取行,而是要获取所有行号的列表或数组(称为索引),其中列表元素的MSoftMeaning为null。

因此,例如,如果第一行和第三行的MSoftMeaning为null,那么我想得到一个看起来像这样的列表(1,3)或[1,3]。

3 个答案:

答案 0 :(得分:2)

您可以先捕获索引,然后过滤并选择原始索引:

var pList = phraseSources
  .Select((item, i) => new {index = i, item = item}) // capture
  .Where(x => string.IsNullOrEmpty(x.item.MSoftMeaning)) // filter
  .Select(p => p.index) // select only indexes
  .ToList(); // or use ToArray()

您需要首先在Select之前以Where捕获索引,否则在最后Select中将获取新列表的索引。

答案 1 :(得分:1)

var pList = phraseSources.Select((x, i) => new {source = x, index = i}).Where(x => string.IsNullOrEmpty(x.source.MSoftMeaning)).Select(x => x.index).ToList();

答案 2 :(得分:0)

您可以使用Enumerable.Range来生成索引。

Enumerable.Range(0, phraseSources.Count)
          .Where(index => string.IsNullOrEmpty(phraseSources[index].MSoftMeaning));

以上内容将保留MSoftMeaning为null的对象的所有索引,但是,如果要使用 position 而不是 index index 0 position 1 index 1 position {{1 }}, index 2 position 2等,如您的帖子中所示,那么您可以执行选择操作,向每个索引加1以产生位置

3

上面的代码将产生一个Enumerable.Range(0, phraseSources.Count) .Where(index => string.IsNullOrEmpty(phraseSources[index].MSoftMeaning)) .Select(index => index + 1); ,其中包含元素IEnumerable<int>