2

我有两个包含字符串的列表。清单 a 和清单 b。目前,我将 Excel 电子表格中 List a 的值写入 A 列,将 List b 的值写入 Column。列表 b 应该与列表 a 具有相同的数据并且是按顺序排列的。这并非总是如此。当我在 excel 中写入列表 b 的值时,如果它在列表 a 中的同一点,我想将值写入单元格中,如果不是,我想在单元格中写入一个空字符串。

我有两个列表a = {"a","b","c", "d", "e", "c", "f" },和b = {"a", "d", "e" ,"c"}。我需要产生第三个列表 c,就像来自两个c = { "a", "", "", "d", "e" ,"c", ""}

试过:

var c = a.Zip(b, (x, y) => x.Equals(y, StringComparison.CurrentCultureIgnoreCase) ? x : "");

但这只会给我c = {"a"}

4

2 回答 2

3

您可以使用以下方法:

IEnumerable<T> FillBlanks<T>(IEnumerable<T> source, IEnumerable<T> collection, T blank)
{
    // TODO error checking
    using(var e = collection.GetEnumerator())
    {
        bool more = e.MoveNext();
        foreach(var x in source)
            if(more && x.Equals(e.Current))
            {
                yield return x;
                more = e.MoveNext();
            }
            else
                yield return blank;
    }
}

例子:

var a = new [] {"a", "b", "c", "d", "e", "c", "f" };
var b = new [] {"a", "d", "e" ,"c"};
var c = FillBlanks(a, b, "");

c就是现在:

在此处输入图像描述

于 2013-04-26T09:15:27.073 回答
1

如果索引很重要:

var c = a.Select((s, i) => b.ElementAtOrDefault(i) == s ? s : "").ToList();

否则:

var c = a.Select(s => b.Contains(s) ? s : "").ToList();

如果情况无关紧要:

var c = a.Select(s => b.Contains(s, StringComparer.CurrentCultureIgnoreCase) ? s : "")
         .ToList();
于 2013-04-26T09:11:26.810 回答