1

我有一个字符串列表,在这个字符串列表中可能有对其他字符串列表的引用。例如,假设列表是这样的:[a.txt, b.txt, c.more],当我遍历列表时,我想在字典中查找:{{'c.more', [c.txt, d.txt]}}所以结果列表是在字典[a.txt, b.txt, c.txt, d.txt]中查找的结果c.more

我在这一点上是这样的:

var dict = new Dictionary<string,List<string>>
{
    {"c.more", new List<string> { "c.txt", "d.txt" } }
}

list.SelectMany(
    f =>
    f.EndsWith(".more")
       ? Expand(f)
       : Include(f, dict))

Where Expand and Include do this:

public IEnumerable<string> Include(string f) { yield return f; }

public IEnumerable<string> Expand(string f, Dictionary<string,List<string>> dict) {
    return dict.ContainsKey(f) ? dict[f] : new List<string>();
}

我可以简单地new List<string> { f }在三元的前半部分返回 a 并在后半部分进行查找的结果,但我想稍后处理递归查找,所以我正在扩展 Expand。现在我并不真正关心内存使用情况,但我觉得可能有一些其他的方式来做我还没见过的事情。

有没有更好的方法来扩展更多列表的列表?

4

1 回答 1

1

您可能不再需要答案,但我仍然想尝试。

一种选择是创建自己的类,继承自IEnumerable. 采取以下措施:

public class LookupList : IEnumerable<string>
{
    private readonly IEnumerable<string> _source;
    private Dictionary<string, List<string>> _referenceDic;

    public LookupList(IEnumerable<string> source, Dictionary<string, List<string>> referenceDic)
    {
        _source = source;
        _referenceDic = referenceDic;
    }

    public IEnumerator<string> GetEnumerator()
    {
        foreach (string item in _source)
        {
            //check if it's in the ref dictionary, if yes: return only sub items, if no: return the item
            if (_referenceDic.Keys.Contains(item))
            {
                foreach (string dicItem in _referenceDic[item])
                    yield return dicItem;
            }
            else
            {
                yield return item;
            }
        }
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

现在运行以下行来访问这些项目。

Dictionary<string, List<string>> refData = new Dictionary<string, List<string>>();
LookupList lst = new LookupList(new List<string>() { "a.txt", "b.txt", "c.more" }, refData);
refData.Add("c.more", new List<string>() { "c.txt", "d.txt" });
List<string> flattenedItems = lst.ToList();
于 2013-03-10T04:12:08.663 回答