2

私は次のプログラムを持っています.私がやろうとしているのは、2つのテキストファイルから持っている名前のリストに参加することです. さらに、ファイルのすべての組み合わせのリストを作成しようとしています。つまり、名前はマークとマイク、姓はウィルソンとワトソンです。マイク・ワトソンとマイク・ウィルソンを作りたいです

    TextReader sr = new StreamReader(textBox1.Text);
        TextReader sr2 = new StreamReader(textBox2.Text);
        string contents = sr.ReadToEnd();
        string contents2 = sr2.ReadToEnd();
        string[] myArray = { contents };
        string[] myArray2 = { contents2 };
        foreach (string element1 in myArray)
        {
            foreach (string element2 in myArray2)
            {
                System.Text.StringBuilder sb = new System.Text.StringBuilder();
                sb.Append(element1);
                sb.Append(" " + element2);
                Debug.WriteLine(sb.ToString());

                string str = sb.ToString();
                Debug.WriteLine(str);

                //MessageBox.Show(sb.ToString);
            }
        }

最終結果は、Mike Smith from file1 : mike, file2 : smith になります。

助けてくれてありがとう

上記の回答の組み合わせを使用して、この回答を思いつきました.テキストファイルを分割するときの「\ r」は、テキストがWindows 2003から読み取られたため重要でした(win 7または2008で結果がどうなるかわかりません)組み込みの配列を使用するのは良いことでしたが、ファイルシステムから実行しようとすると、完全に異なる結果が得られました。「\ r」を追加すると、この投稿を参照してください。

C# では、\n と \r\n の違いは何ですか?

TextReader sr = new StreamReader(textBox1.Text);
        TextReader sr2 = new StreamReader(textBox2.Text);
        string contents = sr.ReadToEnd();
        string contents2 = sr2.ReadToEnd();
        string[] firstNames = contents.Split(new Char[] { '\r','\n',' ', ',' }, StringSplitOptions.RemoveEmptyEntries);
        string[] lastNames = contents2.Split(new Char[] { '\r','\n',' ', ',' }, StringSplitOptions.RemoveEmptyEntries);
        var fullnames =
                    from fn in firstNames
                    from ln in lastNames
                    select new { Fullname = fn + " " + ln };

        foreach (var person in fullnames)
        {
            Debug.WriteLine(person.Fullname);
            //MessageBox.Show(person.Fullname);
        }
4

8 に答える 8

4

リンク

これは、最初の名と最初の姓を結合します

string[] joinednames = myArray.Zip(myArray2, (x, y) => x + " " + y).ToArray();

first firstname with all lastname入会しsecond firstname with all lastnamesてから利用したい方so onはこちら

string[] joinednames = myArray.Select(x => myArray2.Select(y => 
                       x + " " + y)).SelectMany(x => x).ToArray();

最初のリストに名が含まれているとします

"Mark""Marry"

2番目のリストには姓が含まれています

"Watson""Wilson"

最初のスニペットは

"Mark Watson""Marry Wilson"

2番目のスニペットは

"Mark Watson""Mark Wilson""Marry Watson""Marry Wilson"

2番目のスニペットが必要だと思います。

于 2012-05-11T01:32:41.200 に答える
1

この回答は、質問に対して行ったコメントのみに基づいています。あなたのコメントに基づいて、配列の可能なすべての組み合わせを作成しようとしている場合は、LINQ を使用しないソリューションを次に示します。

string[] firstNames = {"Mark", "Mike" };
string[] lastNames = {"Watson", "Wilson" };
IList<string> allNameCombinations = new List<string>();

foreach (string firstname in firstNames)
{
    foreach (string lastname in lastNames)
         allNameCombinations.Add(firstname + " " + lastname);
}

string[] allNames = allNameCombinations.ToArray();

出力配列には次の要素が含まれます

Mark Watson
Mark Wilson
Mike Watson
Mike Wilson
于 2012-05-11T02:26:19.100 に答える
1

現在のコードは近いです。

TextReader sr = new StreamReader(textBox1.Text); 
TextReader sr2 = new StreamReader(textBox2.Text); 

string contents = sr.ReadToEnd(); 
string contents2 = sr2.ReadToEnd(); 

string[] myArray = contents.Split(new Char [] {' ', ','}, StringSplitOptions.RemoveEmptyEntries); 
string[] myArray2 = contents2.Split(new Char [] {' ', ','}, StringSplitOptions.RemoveEmptyEntries); 
System.Text.StringBuilder sb = new System.Text.StringBuilder();

var joinednames = myArray.Zip(myArray2, (x, y) => x + " " + y).ToList();

foreach (string str in joinednames)
{
    Debug.WriteLine(str);
}

名前の間には、おそらく追加のセパレーターが必要です。

編集: VSでいくつかのテストを行った後、私は自分の答えをNikhilのものと組み合わせました。

于 2012-05-11T01:37:08.103 に答える
1

あなたの主な問題は、配列に正しく解析された名前のリストを取得していないことであるというmgnoonanに同意します。名前を配列に入れるための彼の方法に従ってください。しかし、いったんそこに到達したら、2 つの配列を結合するための Nikhil の LINQ ソリューションの優雅さが気に入っています。両方を使用してください。

編集: 以下の例

TextReader sr = new StreamReader(textBox1.Text); 
TextReader sr2 = new StreamReader(textBox2.Text); 

string contents = sr.ReadToEnd(); 
string contents2 = sr2.ReadToEnd(); 

string[] myArray = contents.Split(new Char [] {' ', ','}); 
string[] myArray2 = contents2.Split(new Char [] {' ', ','}); 

string[] joinednames = myArray.Zip(myArray2, (x, y) => x + " " + y).ToArray();

foreach(string element in joinednames)
{
    Debug.WriteLine(element);
}
于 2012-05-11T01:49:17.923 に答える
0

あなたの質問のコメントを読んで、姓と名を組み合わせたすべての可能性をリストしたいと思いませんか?

これを試すことができます:

var fullnames = 
        from fn in firstNames
        from ln in lastNames
        select new { Fullname = fn + " " + ln };

foreach(var person in fullnames) {
    Console.WriteLine (person.Fullname);
}

完全なコード:

using System;
using System.Collections.Generic;
using System.Linq;

public class Test
{
        public static string[] firstNames = {"Mark", "Mike" };
        public static string[] lastNames = {"Watson", "Wilson"};

        public static void Main (string[] args)
        {

                var fullnames = 
                        from fn in firstNames
                        from ln in lastNames
                        select new { Fullname = fn + " " + ln };

                foreach(var person in fullnames) {
                     Console.WriteLine (person.Fullname);
                }

      }
}

出力:

Mark Watson
Mark Wilson
Mike Watson
Mike Wilson

デモコード: http://ideone.com/ei6vh

于 2012-05-11T02:26:08.117 に答える
0

これらの行のコードに何か問題があります:

string contents = sr.ReadToEnd();
string contents2 = sr2.ReadToEnd();

// arrays don't automatically split string content
string[] myArray = { contents };
string[] myArray2 = { contents2 };

これらを行う必要があります:

string contents = sr.ReadToEnd();
string contents2 = sr2.ReadToEnd();

// arrays don't automatically split file content
string[] myArray = contents.Split('\n');
string[] myArray2 = contents2.Split('\n');

または、さらに良いことに、リーダーで分割します。

string[] myArray = sr.ReadToEnd().Split('\n');
string[] myArray2 = sr.ReadToEnd().Split('\n');

一部のテキストファイルの行区切りは一貫していないことに注意してください。一部は\r\n(Windowsアプリからのほとんどのテキストファイル)の組み合わせを使用し、一部は単に使用します。行区切りのみを\n使用するテキストファイルは見たことがありません。\r

代わりにこれを行います:

string[] myArray = 
    sr.ReadToEnd().Split (new[]{"\r\n", "\n", "\r"}, StringSplitOptions.None);

string[] myArray2 = 
    sr.ReadToEnd().Split (new[]{"\r\n", "\n", "\r"}, StringSplitOptions.None);
于 2012-05-11T02:38:07.750 に答える