我和這個用戶有同樣的情況如何使用 string.join 來連接物件陣列中的值?在這個問題中。但是,我想加入物件中的所有值,而不是只有 1 個值。
回顧一下我的問題:我有一個物件陣列,例如:
MyObject[] objs;
在 MyObject 它包含 3 個字串屬性,
object[0].stringValue1
object[0].stringValue2
object[0].stringValue3
如果我想通過它們的所有 stringValues(stringValues1,2 和 3)加入整個物件陣列,我該怎么做?
我認為選擇器不允許我選擇多個元素,那么如何使用 string.join 連接物件陣列中的多個值?
uj5u.com熱心網友回復:
請參閱下面的示例,以了解下面實作部分中提供的兩種擴展方法的用法。第一個允許您選擇要包含的屬性,第二個包含源集合中物件的所有字串屬性,我相信這是您問題的確切答案。
示例用法
請注意,由于每個實作的作業方式,下面兩個示例的結果輸出排序不同,但是由于第一個示例指定MyObj樣本型別上的所有字串屬性,結果在其他方面是相同的
現場小提琴示例
// Test Object
public class MyObj
{
public MyObj(string prop1, string prop2, string prop3)
{
Prop1 = prop1;
Prop2 = prop2;
Prop3 = prop3;
}
public string Prop1 { get; set; }
public string Prop2 { get; set; }
public string Prop3 { get; set; }
}
// Sample Data
var list = new List<MyObj> {
new MyObj("A1", "B1", "C1"),
new MyObj("A1", "B2", "C2"),
new MyObj("A3", "B3", "C3")
};
使用上述物件和資料的示例
// Example #1 - All properties separated by single separator
Console.WriteLine(list.Join(colSeparator: ','));
// RESULT: A1,A1,A3,B1,B2,B3,C1,C2,C3
// Example #2 - Object property separator, and different object separator
Console.WriteLine(list.Join(colSeparator: ',', rowSeparator: '\n'));
// RESULT: A1,B1,C1
A1,B2,C2
A3,B3,C3
執行
public static class EnumerableStringJoinExtension
{
public static string Join<T>(this IEnumerable<T> values, char colSeparator, char? rowSeparator = null)
{
var strProperties = typeof(T).GetProperties().Where(r=>r.PropertyType == typeof(string));
var sb = new StringBuilder();
foreach(var val in values)
sb.Append(string.Join(colSeparator, strProperties.Select(r=> r.GetValue(val)))).Append(rowSeparator ?? colSeparator);
sb.Remove(sb.Length - 1, 1);
return sb.ToString();
}
}
uj5u.com熱心網友回復:
一種可能的解決方法是首先創建一個包含每個物件屬性的陣列(使用.Select()),然后使用.SelectMany(). 這兩種方法都可以在System.Linq命名空間中找到。IEnumerable<string>然后可以使用 連接生成的物件的專案string.Join()。
如果MyObject定義為
class MyObject
{
public string First { get; set; }
public string Second { get; set; }
public string Third { get; set; }
}
你定義objects為
List<MyObject> objects = new()
{
new() { First = "ABC", Second = "DEF", Third = "GHI" },
new() { First = "JKL", Second = "MNO", Third = "PQR" },
new() { First = "STU", Second = "VWX", Third = "YZ" },
};
,一個可能的實作是:
var flattenedObjects = objects
.Select(obj => new[] { obj.First, obj.Second, obj.Third })
.SelectMany(properties => properties);
var objectString = string.Join("_", flattenedObjects);
將 的值列印objectString到控制臺給出:
ABC_DEF_GHI_JKL_MNO_PQR_STU_VWX_YZ
示例小提琴在這里。
uj5u.com熱心網友回復:
如果你只想要一個沒有硬編碼屬性名稱的單行、方便的 C#,你可以試試這個:
string.Join("\n", objs.Select(o => string.Join("_", o.GetType().GetProperties().Select(p => p.GetValue(o)))));
這會產生以下結果:
"A_B_C\nD_E_F\nG_H_I"
物件陣列為:
var objs = new MyObject[]
{
new MyObject("A", "B", "C"),
new MyObject("D", "E", "F"),
new MyObject("G", "H", "I")
};
但請注意,如果您的類有其他型別的屬性,那么您可能需要一個Where()betweenGetProperties()和 secondSelect()來排除不需要的屬性。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/510280.html
標籤:C#数组细绳
