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

最终结果应该是,来自 file1 的 Mike Smith: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

LINQ

这将加入名字和名字

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

如果你想加入然后first firstname with all lastname使用这个second firstname with all lastnamesso on

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

假设第一个列表包含名字

"Mark","Marry"

第二个列表包含姓氏

"Watson""Wilson"

第一个片段会给

"Mark Watson","Marry Wilson"

第二个片段会给

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

我认为第二个片段是你需要的。

于 2012-05-11T01:32:41.200 回答
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);
}

您可能应该在名称之间添加一些额外的分隔符。

编辑:我将我的答案与 Nikhil 的答案结合起来,并在 VS 中进行了一些测试。

于 2012-05-11T01:37:08.103 回答
1

我同意 mgnoonan 的观点,即您的主要问题是您没有将名称列表正确解析到数组中。使用他将名称放入数组的方法。但是,一旦你把它们弄到了那里,我就会喜欢 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 回答
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 回答
0

虽然其他答案很有帮助,但它们并没有解释你哪里出错了。您的原始代码的问题是这些语句:

string[] myArray = { contents }; 
string[] myArray2 = { contents2 }; 

第一条语句创建一个包含一个元素的数组;contents该元素是对变量引用的同一字符串的引用。同样,myArray2是一个具有单个元素的数组 等于contents2

通过分割行分隔符来创建数组:

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

并按照 Nikhil Agrawal 的建议将它们结合起来;但是,您可能会发现查询理解语法更容易理解:

IEnumerable<string> fullNames = 
    from firstName in myArray
    from lastName in myArray2
    select firstName + " " + lastName

或者,颠倒产品的顺序:

IEnumerable<string> fullNames = 
    from lastName in myArray2
    from firstName in myArray
    select firstName + " " + lastName

或者,如果您不想使用 linq:

foreach (string firstName in myArray)
    foreach (string lastName in myArray2)
    {
        string fullName = firstName + " " + lastName;
        // do something with the fullName here
    }
于 2012-05-11T01:51:14.253 回答
0

您需要更好地从文件中读取条目(读取不止一行,每行不止一个条目,空格或逗号分隔):

var firsts = File.ReadAllLines(textBox1.Text).SelectMany(n => n.Split(new Char [] {' ', ','}));
var lasts = File.ReadAllLines(textBox2.Text).SelectMany(n => n.Split(new Char [] {' ', ','}));

然后您可以按照其他答案的建议进行操作:

var fullNames = firsts.Zip(lasts, (f, l) => f + " " + l).ToArray();

注意:确保导入 LINQusing System.Linq;

于 2012-05-11T01:58:16.787 回答
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 回答