2

背景:我有两个包含字符串的列表。清单 a 和清单 b。目前,我将 Excel 电子表格中 List a 的值写入 A 列,将 List b 的值写入 Column。列表 b 应该与列表 a 具有相同的数据并且是按顺序排列的。这并非总是如此。

问题:当我在excel中写入列表b的值时,如果它在同一点列表a中,我想在单元格中写入值,否则我想在单元格中写入一个空字符串。

编辑:感谢您的回复和答案工作得很好,刚刚意识到我真正需要的是:

如果两个列表是:

a = {"a", "b", "c", "d", "e" }
b = {"a", "d", "e" }

操作的结果应该是:

{ "a", "", "", "d", "e" }
4

3 回答 3

5

一种方法是将zip您的列表放在一起并用空字符串替换列表 b 中的“错误”值:

var a = new [] {"a",   "b", "c",   "d"};
var b = new [] {"a", "Foo", "c", "Bar"};

var fixed_b = a.Zip(b, (x, y) => x == y ? x : "");

fixed_b现在产生"a",""和."c"""

将数据写入 excel 电子表格时,只需迭代fixed_b而不是b

编辑:

根据您的评论:

你可以像这样创建一个小助手方法:

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

var fixed_b = FillBlanks(a, b, String.Empty);
于 2013-04-26T08:01:05.510 回答
1
int max = aList.Count > bList.Count ? aList.Count : bList.Count;
for(int i = 0; i < max; ++i)
{
    if(i < aList.Count)
        Write(aList[i]);

    if(i < bList.Count)
    {
        if(i < aList.Count)
            Write(aList[i] == bList[i] ? bList[i] : "");
        else
            Write(bList[i]);
    }
}

这假设Write实际将数据写入电子表格。

于 2013-04-26T07:50:32.533 回答
0

尝试这个:

class Program
{
    static void Main(string[] args)
    {
        List<string> listA = new List<string>() { "a", "b", "c" };
        List<string> listB = new List<string>() { "a", "c", "b" };

        var result = listB.Select((b, index) =>
            (index == listA.IndexOf(b)) ? b : "");
    }
}
于 2013-04-26T07:53:21.717 回答