0

文字列のリストを取得しました。このリストで、各アイテムを残りのアイテムと連結する操作を実行したいと考えています。以下のテストは現在失敗しています。結合は、私が使用すべき正しい linq メソッドではないと思います。これを行う方法を教えてください。出力のパターンは、投影がどうあるべきかを示す必要があります。そうでない場合、ルールは単純です。1 つのアイテムを取得し、他のすべてのアイテムと連結してから、次のアイテムに移動します。以下のテスト:

[Test]
        public void Should_concatenate_all_items()
        {
            var items = new List<string> {"a", "b", "c", "d"};

            var concatenatedList = items .Join(items , x => x, y => y, (x, y) => string.Concat(x, y));

            foreach (var item in concatenatedList)
            {                
                //Should output:ab
                //Should output:ac
                //Should output:ad
                //Should output:bc
                //Should output:bd
                //Should output:cd
                Console.WriteLine(item);
            }
        }   

:.NET 3.5を使用しています。

4

3 に答える 3

0

私の解決策はやり過ぎかもしれませんが、実際の状況ではおそらくもっと役に立ちます。また、Linq でクリーンな方法を見つけることができませんでした。Linq の Except は、これには適していないようです。

IEnumerator を使用して値を列挙できます。

public class ConcatEnum : IEnumerator
{
    public List<String> _values;

    // Enumerators are positioned before the first element 
    // until the first MoveNext() call. 
    int position1 = 0;
    int position2 = 0;

    public ConcatEnum(List<String> list)
    {
        _values = list;
    }

    public bool MoveNext()
    {
        position2 = Math.Max(position2 + 1, position1 + 1);
        if (position2 > _values.Count - 1){
            position1++;
            position2 = position1 + 1;
        }

        return position1 < _values.Count - 1;
    }

    public void Reset()
    {
        position1 = 0;
        position2 = 0;
    }

    object IEnumerator.Current
    {
        get
        {
            return Current;
        }
    }

    public String Current
    {
        get
        {
            try
            {
                return _values[position1] + _values[position2];
            }
            catch (IndexOutOfRangeException)
            {
                throw new InvalidOperationException();
            }
        }
    }

    public IEnumerator GetEnumerator()
    {
        this.Reset();
        while (this.MoveNext())
        {
            yield return Current;
        }
    }
}

次のように呼び出します。

var items = new List<string> { "a", "b", "c", "d" };
foreach (var i in new ConcatEnum(items))
{
    //use values here
}
于 2013-10-15T23:40:36.127 に答える
0
var concatenatedList = (from i in items
                     from x in items
                     where i != x
                     select string.Concat(i, x)).ToList();

リストした正確な出力の場合:

 var concatenatedList = (from i in items
                     from x in items
                     where i != x && items.IndexOf(i) < items.IndexOf(x)
                     select string.Concat(i, x)).ToList();
于 2013-10-15T23:30:48.880 に答える