C# 从两个列表中产生一个列表

C# 从两个列表中产生一个列表,c#,excel,list,C#,Excel,List,我有两个列表,它们都是有意义的。表a和表b。此时,我将excel电子表格中列表a的值写入a列,将列表b的值写入b列。清单b应具有与清单a相同的数据,并按顺序排列。情况并非总是如此。 当我在excel中写入列表b的值时,如果值在列表a的同一点上,我想将其写入单元格,如果不是,我想将空字符串写入单元格 我有两个列表a={a”,“b”,“c”,“d”,“e”,“c”,“f”},和b={a”,“d”,“e”,“c”}。我需要生成第三个列表c,比如从两个c={“a”,“e”,“c”,“e”} 尝试: va

我有两个列表,它们都是有意义的。表a和表b。此时,我将excel电子表格中列表a的值写入a列,将列表b的值写入b列。清单b应具有与清单a相同的数据,并按顺序排列。情况并非总是如此。 当我在excel中写入列表b的值时,如果值在列表a的同一点上,我想将其写入单元格,如果不是,我想将空字符串写入单元格

我有两个列表
a={a”,“b”,“c”,“d”,“e”,“c”,“f”}
,和
b={a”,“d”,“e”,“c”}
。我需要生成第三个列表c,比如从两个
c={“a”,“e”,“c”,“e”}

尝试:

var c = a.Zip(b, (x, y) => x.Equals(y, StringComparison.CurrentCultureIgnoreCase) ? x : "");
但这只会给我
c={“a”}

如果索引重要:

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();
如果索引很重要:

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();

您可以使用以下方法:

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;
    }
}
c
现在是:


您可以使用以下方法:

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;
    }
}
c
现在是:



背后的逻辑是什么?您还需要格式化您的问题并向我们展示您的尝试:)这些是字符串列表。。右表?位置重要吗?@HosseinNarimaniRad逻辑大致是:逐步比较a和b。如果a中有一个元素在b中“缺失”,请“填写”一个空白字符串。背后的逻辑是什么?您还需要格式化您的问题并向我们展示您的尝试:)这些是字符串列表。。右表?位置重要吗?@HosseinNarimaniRad逻辑大致是:逐步比较a和b。如果a中有一个元素在b中“缺失”,请“填入”一个空白字符串。我认为它不会返回正确的结果。如此优雅的sol真是太好了。好的tim@MarcinJuraszek:现在已测试,是的,它不会产生所需的结果(仅
a
)。然而,我必须承认,我还不理解逻辑。逻辑大致是:逐步比较
a
b
。如果
a
中有一个元素在
b
中“缺失”,则“填充”一个空白字符串。这里b是a的子集,如果b有更多的元素而a有更少的元素,这将不起作用,那么我认为它不会返回正确的结果。如此优雅的sol值得称赞。好的tim@MarcinJuraszek:现在已测试,是的,它不会产生所需的结果(仅
a
)。然而,我必须承认,我还不理解逻辑。逻辑大致是:逐步比较
a
b
。如果
a
中有一个元素在
b
中“缺失”,则“填充”一个空白字符串。这里b是a的子集,如果b有更多的元素而a有更少的元素,这将不起作用then@svick对。去掉了无用的石膏。最好创建一个重载,该重载接受并使用
IEqualityComparer
@svick True。去掉了无用的石膏。最好创建一个重载,该重载接受并使用
IEqualityComparer